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

时间:2016-04-21 13:48:17

标签: c arrays struct

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

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

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

2 个答案:

答案 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)

一些事情:

  1. 这需要进行测试。

  2. 我会避免将_t用于struct keywords_t,因为_t是为POSIX类型保留的。我使用_s表示结构,使用_pt作为指针......但这取决于你。