gpt4 book ai didi

c - keil error #28 表达式必须有常量值

转载 作者:太空宇宙 更新时间:2023-11-04 05:33:28 26 4
gpt4 key购买 nike

我正在使用 Keil uVision 为嵌入式项目编译这段代码。

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

我读到这是编译器不知道变量大小的问题。我不明白那是什么意思。

变量 a 和 b 是定义的类型,所以它们的指针总是相同大小?无论它们的类型如何,它都是嵌入式的,所以指针的大小都相同?

它可以使 var a 和 b 静态化,为什么?这是嵌入式的,我不希望连续分配内存,所以这不是解决方案。

更新:我正在使用 Keil uVision 4.72.10.0 和 Armcc v5.03.0.76 - 我能够让 Keil 编译它,使用“--c99”标志,如发现的那样here .

最佳答案

您的函数在现代 C 中甚至在 C99 中都完美无缺,但 C90 对初始化器有更严格的规则,而您的代码不符合这些规则。

C90的相关规定如下:

All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions.

(C90 6.5.7/4;已强调)

结构类型是聚合类型,因此适用于您的代码(当根据 C90 进行解释时)。其中 ab 标识函数范围变量,表达式 &a&b 不是常量表达式,所以你的代码不符合(C90)。

C99 删除了关于聚合或 union 类型的内容,C2011 为具有线程存储持续时间的对象添加了一条规定(该版本的 C 中的新功能)以产生:

All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

不适用于您的代码。


那么,您的编译器似乎正在执行 C90 规则。也许可以选择更新的标准,但如果没有,那么最好的选择可能是使用赋值语句而不是初始化程序来设置结构成员的值:

test_t t[2];
t[0].pVoid = &a;
t[1].pVoid = &b;

关于c - keil error #28 表达式必须有常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com