这是我的代码:
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
有谁知道我做错了什么?
答案 0 :(得分:2)
从现代C语言的角度来看,您的代码没有任何问题。
但如果您使用的是非常迂腐的旧C89 / 90编译器,它将坚持所有聚合初始值设定项都由常量表达式组成。这将阻止您在此类初始化程序中使用本地对象的地址,因为此类地址不是常量。
此限制已在C99中解除:自动对象的聚合初始值设定项不再仅限于常量表达式。
然而,我所知道的每一个C89 / 90编译器都忽略了这种限制,并且从一开始就支持现代行为。是不是故意配置你的编译器是为了非常迂腐地执行C89 / 90规则?