使用GCC,对于以下代码的第二行,我收到“初始化元素不是恒定的”错误:

uint8_t gBuffer[512 + 4]; /* Data buffer */
uint8_t* gAlignedBuffer = (uint8_t*)(((uint32_t)gBuffer + 4) & 0xFFFFFFFCU);   /* Align buffer to 4-byte boundary */

但是如果我改变
0xFFFFFFFCU

+ 0xFFFFFFFCU
代码可以编译:
uint8_t gBuffer[512 + 4]; /* Data buffer */
uint8_t* gAlignedBuffer = (uint8_t*)(((uint32_t)gBuffer + 4) + 0xFFFFFFFCU);   /* Align buffer to 4-byte boundary */

为什么是这样?

最佳答案

显然,您是在文件范围内声明变量。文件作用域变量具有静态存储持续时间,并且需要恒定的初始化程序。

尽管您的初始化程序不完全满足地址常量表达式的最严格和最狭窄的定义(如语言规范中所定义),但特定的编译器可能仍支持它们。您观察到的不一致并没有真正的理由存在。我猜想这是该特定编译器的古怪之处。

10-04 19:21