我想利用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 state"索引值必须是常量表达式,即使正在初始化的数组是自动的"。
我一直认为enum
是一个常数表达式,为什么会出现这种情况呢?
答案 0 :(得分:1)
代码运行正常,正如预期的 * :
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。
答案 1 :(得分:0)
这不是GCC中的错误,但是您初始化超出了范围。
确定:
#define profil_a = 0
#define profil_b = 1
foo_ini [ profil_a, profil_b ];
错误:
//#define profil_a = 0
#define profil_b = 1
foo_ini [ profil_b ];
修复:
//#define profil_a = 0
#define profil_b = 0
foo_ini [ profil_b ];