「int size = 10;」を実行します。定数式を生成しますか?
以下のコード スニペットは、gcc 4.8 および Clang 3.2 で正常にコンパイルされます。
int main() { int size = 10; int arr[size]; }
C 標準 (8.3.4/1) によると、配列のサイズは整数の定数式である必要があります。ただし、コード内の「size」は整数の定数式ではないようです。これはコンパイラのバグですか、それとも私たちの認識上の見落としですか?
Visual Studio C は、「エラー C2466: 定数サイズ 0 の配列を割り当てることができません」というメッセージを表示してこのコードを拒否します。これは、コンパイラが「サイズ」をゼロとみなすことを意味します。
説明
gcc と Clang は、可変長配列 (VLA) をサポートします。 C の拡張子。 VLA は、配列のサイズを実行時に決定できるようにする C99 機能です。コード スニペットでは、「サイズ」はコンパイル時に決定されますが、リテラルの定数ではありません。したがって、gcc と Clang では「サイズ」は VLA とみなされます。
一方、Visual Studio は VLA をサポートせず、C 標準に準拠しています。その結果、「サイズ」がリテラル定数ではないため、コードが拒否されます。
標準準拠
C 標準は 整数定数式 は、評価されると整数型またはスコープなしの列挙型の prvalue になる式として使用されます。この場合、「size」はリテラル値 (10) で初期化され、整数定数式になります。
gcc および Clang で「-pedantic」フラグを使用すると、可変長配列に関する警告が生成されます。コードスニペットで。 「-pedantic-errors」を使用すると、警告がエラーになります。
解決策
C 標準に準拠するには、「size」を const またはconstexpr 整数:
const int size = 10;
または
constexpr int size = 10;
以上が`int size = 10;` は C の定数式ですか: コンパイラの互換性の問題ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。