3

私のコンパイラは、最新の 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 などのコンパイル時の定数ではないのはなぜですか?

4

2 に答える 2

4

質問するのではなく: sizeof 式が 2、4、8 などのコンパイル時の定数ではないのはなぜですか?

(実際に、これらの例と同じようにコンパイル時の定数であるためです。(: 新しい C 標準から可変長配列を除外し、実行時の式にする必要があります :))

質問した方がよいでしょう: sizeof 式のようなコンパイル時定数を受け入れないのはなぜですか?align(...)

Microsoft__declspec(align(#))は、少数の値のセットのみを受け入れるように定義しました: https://msdn.microsoft.com/en-us/library/83ythb65.aspxを参照してください。

「# はアライメント値です。有効なエントリは、2、4、8、16、32、または 64 など、1 から 8192 (バイト) までの 2 のべき乗の整数です。」

したがって、単純な定数であっても、任意の値が許可されるわけではありません。 __declspec(align(7))は 2 の累乗ではないため、許可されません。 のような単純な式でさえ__declspec(align(4+4))許可されません。

于 2015-07-27T22:40:46.467 に答える