C错误:"初始化元素不是常数"用&,与+一起使用

Ang*_*uel 9 c gcc compiler-errors

使用GCC,我得到以下代码的第二行的"初始化元素不是常量"错误:

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

但是,如果我将& 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 */ 
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

AnT*_*AnT 2

显然您是在文件范围内声明变量。文件范围变量具有静态存储持续时间,并且需要常量初始值设定项。

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