繁体   English   中英

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

[英]C error: “initializer element is not constant” with &, works with +

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

为什么是这样?

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

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

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

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

我怀疑这里运算符优先级正在发生。 &先于高于+。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM