我想利用 C99 指定的数组初始化程序来帮助使我的代码更加自记录,但我遇到了下面描述的问题。
假设我有一个枚举和一个将枚举映射到其他有用数据结构的数组,例如:
enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC };
int32_t const g_stress_levels[3] = {
[STATE_IDLE] = 10,
[STATE_WORKING] = 40,
[STATE_PANIC] = 90
};
使用 TDM-GCC-32 gcc 4.8.1 和 -std=c99
编译上述内容,不会出现任何警告。下面的代码片段不会,而是会引发错误“初始化程序中的数组索引超出数组边界”。
enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC, TOTAL_STATES };
int32_t const g_stress_levels[TOTAL_STATES] = {
[STATE_IDLE] = 10,
[STATE_WORKING] = 40,
[STATE_PANIC] = 90
};
The GCC docs状态“索引值必须是常量表达式,即使正在初始化的数组是自动的”。
然而,我一直认为 enum
是一个常量表达式,那么为什么会出现这种情况呢?
最佳答案
代码运行良好,符合预期*:
gsamaras@gsamaras-A15:~$ cat px.c
#include <stdint.h>
enum { STATE_IDLE = 0, STATE_WORKING, STATE_PANIC, TOTAL_STATES };
int32_t const g_stress_levels[TOTAL_STATES] = {
[STATE_IDLE] = 10,
[STATE_WORKING] = 40,
[STATE_PANIC] = 90
};
int main(void) {
return 0;
}
gsamaras@gsamaras-A15:~$ gcc -Wall -std=c99 -o px px.c
gsamaras@gsamaras-A15:~$
问题一定出在其他地方。您还现场查看here .
关于c - "Array index in initialiser exceeds array bounds",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37099427/