使用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 */
为什么会这样?
答案 0 :(得分:2)
显然,您在文件范围内声明了变量。文件范围变量具有静态存储持续时间并需要常量初始值设定
虽然初始化程序并不完全满足地址常量表达式的最严格和最窄的定义(如语言规范中所定义),但您的特定编译器仍可能支持它们。你观察到的不一致性并没有真正的理由存在。我猜这是特定编译器的一个怪癖。
答案 1 :(得分:2)
由于这些变量是文件范围,因此它们具有静态存储,因此行为与您的输出文件格式支持的relocations类型有关(我假设它是ELF)。
基本上,在这种情况下,ELF对象支持向未知地址添加任何数字,但不应用掩码(这基本上是&
操作所做的)。您需要将第二个语句移动到一个函数中。
答案 2 :(得分:-2)
我怀疑这里运算符优先级正在发生。 &安培;优先级高于+。