簡體   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