初始化元素在Clang / GCC中不是常量

时间:2016-02-23 23:52:02

标签: c gcc clang

我最近一直在制作一个Roguelike,并且已经使用这个特定代码获得了编译错误:

typedef const char* string;

typedef struct {
string name;
string desc;
int dice;
int sides;
} weapon;

typedef struct {
string name;
string desc;
int dice;
int sides;
} armor;

typedef struct {
string name;
char icon;
int x;
int y;
weapon wep;
armor arm;
int hp;
int maxhp;
} creature;

这是一个头文件。

另一个文件定义了外部变量:

extern creature monsters[MAX_MONSTERS];
extern creature level_cre[MAX_LEVELCRE];
extern weapon weapons[MAX_WEAPONS];
extern armor armors[MAX_ARMORS];

在定义武器和装甲阵列的文件中:

weapon weapons[MAX_WEAPONS] = {
    {"Sword", "A steel sword", 1, 6},
};

armor armors[MAX_ARMORS] = {
    {"Leather", "Leather armor", 1, 10},
};

正在给我一个错误的部分:

creature monsters[MAX_MONSTERS] = {
    {"Skeleton", 's', 0, 0, weapons[0], armors[0], 100, 100},
    {"Orc", 'o', 0, 0, weapons[0], armors[0], 100, 100},
};

运行这个给了我标题中的错误,并且在做了一些研究之后,它似乎来自于没有正确定义常量。我在这里完全不知道该做什么。任何帮助,将不胜感激。 :)

1 个答案:

答案 0 :(得分:0)

ISO / IEC 9899:201x 初始化,§4:

  

初始化程序中具有静态或。的对象的所有表达式   线程存储持续时间应为常量表达式或字符串   文字。

ISO / IEC 9899:201x 常量表达式,§7:

  

初始值设定项中的常量表达式允许更多纬度。   这样的常数表达式应该是或者评估为其中之一   以下:
   - 算术常量表达式,
   - 空指针常量,
   - 地址常量或
   - 完整对象类型的地址常量加或减   整数常量表达式。

weapons[0]armors[0]均不属于上述情况。但正如奥拉夫建议你可以改为

weapon *wep;
armor *arm;
…
    {"Skeleton", 's', 0, 0, &weapons[0], &armors[0], 100, 100},
    {"Orc",      'o', 0, 0, &weapons[0], &armors[0], 100, 100},

- &weapons[0]&armors[0]是地址常量,因此可用于初始值设定项。