9

使用 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 */ 

为什么是这样?

4

3 回答 3

2

显然你是在文件范围内声明你的变量。文件范围变量具有静态存储持续时间并且需要常量初始化程序。

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

于 2013-06-28T14:27:07.010 回答
2

由于这些变量是文件范围,它们具有静态存储,因此行为与您的输出文件格式支持的重定位类型有关(我假设它是 ELF)。

基本上,在这种情况下,ELF 对象支持将任何数字添加到未知地址,但不应用掩码(这基本上是&操作所做的)。您需要将第二条语句移动到一个函数中。

于 2013-06-28T14:31:24.570 回答
-2

我的怀疑是这里的运算符优先级正在发生一些事情。& 的优先级高于 + 。

于 2013-06-28T14:30:54.027 回答