私のコンパイラは、最新の 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 などのコンパイル時の定数ではないのはなぜですか?
私のコンパイラは、最新の 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 標準から可変長配列を除外し、実行時の式にする必要があります :))
質問した方がよいでしょう:
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))
許可されません。