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

标签 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

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

最佳答案

在 C 中,const变量不是常量,它们只是不能更改的变量。因此它们的值不能用在常量表达式中,比如在结构初始化器中。

一种解决方法是使用预处理器定义初始化程序:

#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]

关于c - 使用数组中的数据初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36771645/

相关文章:

c - 简单的 C 问题 : compare first char of a char array

c - 为什么 scanf 不能在正式输入末尾使用空格?

java - 通过 java 2D ArrayList 字符串进行矩阵搜索以查找重复实例,广度优先?

.net - 当结构体实例的属性为 'Reference Type?' 时会发生什么

c - 如何删除一个数组结构体,并且最后一个索引不能被其他索引替换?

c - 简单的 UDP 服务器不能接受数据包

c++ - C 和 C++ 关于++ 运算符的区别

java - 在 java 中打印多维数组的最佳方法是什么?

javascript - 如何动态循环 json 字符串中的所有值

c++ - 那么现在 struct 可以有虚函数并支持继承吗?那么与 classes 有什么区别呢?信息隐藏的真正目的是什么?