使用数组中的数据初始化结构

mar*_*trz 0 c arrays struct

我想将我的关键字保存在结构中:

typedef const char* label;
const struct keywords_t
{
    label init;
    label moveUnit;
} keywords;
Run Code Online (Sandbox Code Playgroud)

但我希望能够检查关键字是否对for循环有效,所以我尝试初始化这样的结构:

const label allowed_keywords[] =
{
    "INIT",
    "MOVE"
};

const struct keywords_t keywords =
{
    allowed_keywords[0],
    allowed_keywords[1]
};
Run Code Online (Sandbox Code Playgroud)

这给了我一个

error: initializer element is not constant
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?但是整个数组是不变的.

use*_*733 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
};
Run Code Online (Sandbox Code Playgroud)

其他方法可能是使用枚举和数组的组合:

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]
Run Code Online (Sandbox Code Playgroud)