我想制作const字符串的模块化枚举矩阵。
我做了两个typedef
globals.h
#define PAGES_COUNT 8
#define PARAMETERS_COUNT 8
typedef const char* const rom_string;
typedef rom_string const* const rom_string_array;
pages.h
#include "globals.h"
typedef enum page_enum{
PAGE_1_ENUM,
PAGE_2_ENUM,
}page_enum;
extern rom_string pages_names[PAGES_COUNT];
extern rom_string_array page_list[PAGES_COUNT];
pages.c
#include "globals.h"
#include "pages.h"
#include "page_1.h"
#include "page_2.h"
rom_string pages_names[PAGES_COUNT] = {
[PAGE_1_ENUM] = page_1_name,
[PAGE_2_ENUM] = page_2_name,
};
rom_string_array page_list[PAGES_COUNT] = {
[PAGE_1_ENUM] = page_1,
[PAGE_2_ENUM] = page_2,
};
page_1.h
typedef enum page_1_params{
PAGE_1_PARAMETER_A,
PAGE_1_PARAMETER_B,
PAGE_1_PARAMETER_C,
PAGE_1_PARAMETER_D,
PAGE_1_PARAMS_END,
}page_1_params;
#define PAGE_1_PARAMS_COUNT (PAGE_1_PARAMS_END)
extern rom_string page_1_name;
extern rom_string_array page_1[PARAMETERS_COUNT];
page_1.c
#include "globals.h"
#include "page_1.h"
rom_string page_1_name = "page1.";
rom_string_array page_1[PARAMETERS_COUNT] = {
[PAGE_1_PARAMETER_A] = "text1",
[PAGE_1_PARAMETER_B] = "text2",
[PAGE_1_PARAMETER_C] = "text3",
[PAGE_1_PARAMETER_D] = "text4",
[PAGE_1_PARAMS_END] = "",
};
page_2.h
#include "globals.h"
typedef enum page_2_params{
PAGE_2_PARAMETER_A,
PAGE_2_PARAMETER_B,
PAGE_2_PARAMETER_C,
PAGE_2_PARAMETER_D,
PAGE_2_PARAMS_END,
}page_2_params;
#define PAGE_2_PARAMS_COUNT (PAGE_2_PARAMS_END)
extern rom_string page_2_name;
extern rom_string_array page_2[PARAMETERS_COUNT];
page_2.c
#include "globals.h"
#include "page_2.h"
rom_string page_2_name = "page2.";
rom_string_array page_2[PARAMETERS_COUNT] = {
[PAGE_2_PARAMETER_A] = "text5",
[PAGE_2_PARAMETER_B] = "text6",
[PAGE_2_PARAMETER_C] = "text7",
[PAGE_2_PARAMETER_D] = "text8",
[PAGE_2_PARAMS_END] = "",
};
问题1:warning
我已经在联机C编译器中尝试了“小型”原型,并且没有警告,但是在我的主“ XC8”上,我收到了下一条警告消息,每个数组的每个参数都发出一个警告消息:
incompatible pointer types initializing 'rom_string_array' (aka 'const char *const *const') with an expression of type 'rom_string_array [8]' [-Wincompatible-pointer-types]
[8]这里来自array size宏。不同的数组会有所不同。
问题2:error
error: initializer element is not a compile-time constant
此元素发生此错误:
[PAGE_1_ENUM] = page_1_name,
pages_names
个数组。如果我删除此元素,则下一个错误会发生。与page_list
ive有相同的情况。这对我来说并不明智,我认为这是一个链接器工作。所以我必须做的是,将所有文件都包含在一个文件中?我可以解决这个问题吗?
根据要求重新加工。
当用rom_string_array
声明这样的变量时:
rom_string_array my_array[SIZE];
与以下相同:
rom_string const* const my_array[SIZE];
与以下相同:
const char* const const* const my_array[SIZE];
所以您声明的内容(暂时忽略const
量词)不是char *
的数组,而是char **
的数组。您应该完全取消rom_string_array
并像这样创建数组:
rom_string my_array[SIZE];
关于“初始化程序元素不是编译时常数”错误,如错误消息所述,只能使用编译时常数来初始化在文件范围内定义的变量。其中包括数字常量,字符串常量和涉及这些常量的简单表达式,以及扩展到其中之一的预处理器宏。它确实not包括其他变量,即使它们已声明为const
。
因此,您需要将ui_page_service_name
更改为宏,以使其可用作初始化程序,即:
#define ui_page_service_name "123"