You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:17