表达式必须具有常量值(C中的错误)

时间:2016-12-07 20:46:47

标签: c pointers compiler-errors constants

这是我的代码:

int main (void) {

    struct state
    {
        int output;
        int time;
        const struct state *next[4];
    };

    typedef const struct state state_t;

    # define wait1noclick &fsm[0]
    # define fast2 &fsm[1]
    # define wait2noclick &fsm[2]
    # define fast1 &fsm[3]
    # define wait1click &fsm[4]
    # define wait1 &fsm[5]
    # define wait2click &fsm[6]
    # define wait2 &fsm[7]

    state_t fsm[8] = 
    {
        {0xC, 600, {wait1noclick, fast2, wait1click, fast2}},
        {0x1, 150, {fast2, wait2noclick, fast2, wait2noclick}},
        {0x3, 600, {wait2noclick, fast1, wait2click, fast1}},
        {0x4, 150, {fast1, wait1noclick, fast1, wait1noclick}},
        {0x8, 200, {wait1click, wait1, wait1click, wait1}},
        {0x5, 200, {wait1, fast2, wait1, fast2}},
        {0x2, 200, {wait2click, wait2, wait2click, wait2}},
        {0xA, 200, {wait2, fast1, wait2, fast1}}
    };
}

它可以在没有问题的情况下进行编译,但我一直收到此错误消息,每次都会收到4次" fsm"行:

error: #28: expression must have a constant value

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:2)

从现代C语言的角度来看,您的代码没有任何问题。

但如果您使用的是非常迂腐的旧C89 / 90编译器,它将坚持所有聚合初始值设定项都由常量表达式组成。这将阻止您在此类初始化程序中使用本地对象的地址,因为此类地址不是常量。

此限制已在C99中解除:自动对象的聚合初始值设定项不再仅限于常量表达式。

然而,我所知道的每一个C89 / 90编译器都忽略了这种限制,并且从一开始就支持现代行为。是不是故意配置你的编译器是为了非常迂腐地执行C89 / 90规则?