ホームページ >バックエンド開発 >C++ >`int size = 10;` は C の定数式ですか: コンパイラの互換性の問題ですか?

`int size = 10;` は C の定数式ですか: コンパイラの互換性の問題ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 22:08:15874ブラウズ

Is `int size = 10;` a Constant Expression in C  : A Compiler Compatibility Issue?

「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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。