簡體   English   中英

為什么sizeof表達式不是像2,4,8等編譯時常量?

[英]Why is the sizeof expression not a compile-time constant like 2, 4, 8, etc.?

我的編譯器是最新的VC ++ 2013預覽版。

int main()
{
    __declspec(align(4))           int n1 = 0; // OK.
    __declspec(align(sizeof(int))) int n2 = 0; // error C2059: syntax error : 'sizeof'
}

為什么sizeof表達式不是像2,4,8等編譯時常量?

而不是問: 為什么sizeof表達式不是像2,4,8等編譯時常量?

(因為實際上,它一個編譯時常量,就像那些例子一樣。(:禁止來自較新的C標准的可變長度數組,它必須是運行時表達式:))

最好問一下: 為什么align(...)不接受像sizeof表達式那樣的編譯時常量?

Microsoft將__declspec(align(#))定義為僅接受一小組值:請參閱: https//msdn.microsoft.com/en-us/library/83ythb65.aspx

“#是對齊值。有效條目是從1到8192(字節)的2的整數冪,例如2,4,8,16,32或64。”

因此,即使使用簡單的常量,也不允許任何值。 不允許__declspec(align(7)) ,因為它不是2的冪。即使是像__declspec(align(4+4))這樣的簡單表達式也是不允許的。

在C標准中

sizeof運算符不應該應用於具有函數類型或不完整類型的表達式,這種類型的帶括號的名稱,或者應用於指定位字段成員的表達式。 _Alignof運算符不應用於函數類型或不完整類型。

sizeof運算符產生其操作數的大小(以字節為單位),該操作數可以是表達式或類型的帶括號的名稱。 大小由操作數的類型確定。 結果是整數。 如果操作數的類型是可變長度數組類型,則計算操作數; 否則,不評估操作數,結果是整數常量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM