我想将关键字保存在结构中:
typedef const char* label;
const struct keywords_t
{
label init;
label moveUnit;
} keywords;
但我希望能够检查一个关键字是否对for循环有效,所以我尝试像这样初始化结构:
const label allowed_keywords[] =
{
"INIT",
"MOVE"
};
const struct keywords_t keywords =
{
allowed_keywords[0],
allowed_keywords[1]
};
这给了我一个
error: initializer element is not constant
我做错了什么?但整个数组是不变的。
答案 0 :(得分:7)
在C const
中,变量不是常量,它们只是无法更改的变量。因此,它们的值不能用在常量表达式中,例如struct initializer。
一种解决方法是使用预处理器定义初始化器:
#define KEYWORD_INIT "INIT"
#define KEYWORD_MOVE "MOVE"
const label allowed_keywords[] =
{
KEYWORD_INIT,
KEYWORD_MOVE
};
const struct keywords_t keywords =
{
KEYWORD_INIT,
KEYWORD_MOVE
};
其他方法可能是使用枚举和数组的组合:
typedef enum {
KEYWORD_INIT,
KEYWORD_MOVE
} label;
const char * const keyword_strings[] = {
"INIT",
"MOVE"
};
const struct keywords_t keywords =
{
KEYWORD_INIT,
KEYWORD_MOVE
};
// Getting keyword string would be like this:
// keyword_strings[keywords.moveUnit]
答案 1 :(得分:1)
我可能是最好的资源,但是Arrays和Structs都是简单的内存映射工具。
char *
数组和包含相同数量char *
的结构应该具有相同的内存结构和相同的内存占用量。
所以,在实践中,你需要的只是将数组转换为结构而不是其他任何东西(这也会节省你的内存,虽然这可能不那么重要)。
即
const label allowed_keywords[] =
{
"INIT",
"MOVE"
};
typedef const char* label;
const struct keywords_t
{
label init;
label moveUnit;
};
// struct keywords_t * keywords = (struct keywords_t *) allowed_keywords;
#define keywords ((struct keywords_t *) allowed_keywords)
一些事情:
这需要进行测试。
我会避免将_t
用于struct keywords_t
,因为_t
是为POSIX类型保留的。我使用_s
表示结构,使用_pt
作为指针......但这取决于你。