Keil编译报错#28:表达式需为常量值的问题咨询与解决
Keil uVision编译报错#28的原因分析与解决办法
先看你编译的这段代码:
void doSomething(void) { unsigned char a = 0x01; unsigned char b = 0x02; typedef struct { void *pVoid; } test_t; test_t t[] = {{&a}, {&b}}; }
你在最后一行收到的错误是:
error: #28: expression must have a constant value
为什么会报错?
这个问题和变量类型、指针大小无关,根源是C标准的语法限制:在C90标准里,函数内的普通局部变量(自动存储期)的地址属于非常量表达式,而用非常量表达式来初始化数组(哪怕是局部数组)是不被允许的。Keil默认可能采用的是C90标准,所以编译器严格执行了这个规则,抛出了错误。
你提到把a、b设为static就能编译,是因为static变量属于静态存储期,它的地址在链接阶段就确定了,属于常量表达式,符合C90的初始化要求。但如果不想让变量持续占用内存,这个方案确实不适用。
解决办法
你后来尝试添加--c99编译标志后成功编译,这是因为C99标准放宽了这个限制——允许使用自动变量的地址来初始化局部数组。你的Armcc v5.03支持C99,所以开启这个编译选项就能解决问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

