非標準ステータスにもかかわらず C で可変長配列 (VLA) を受け入れる
C は可変長配列 (VLA) を正式にサポートしていませんが)、g コンパイラと Clang コンパイラは両方とも、驚くべきことにそれらを有効な構文として受け入れます。これにより、コンパイラの動作と VLA に対する標準の立場について疑問が生じます。
コンパイラの受け入れ
g や Clang などの C コンパイラは、VLA を非標準拡張として許可します。これは、そのような宣言を許可していた古い C コンパイラとの歴史的な互換性によるものと考えられます。
標準定義
C 標準では、[dcl.配列]。配列サイズの指定には定数式のみが許可されます。提供されているコード例では、n は定数式ではないため、標準に従って VLA 宣言は無効になります。
実装の詳細
VLA は非標準であるにもかかわらず、 C では、多くの場合、スタック上にメモリを割り当て、ループを使用して要素にアクセスすることによって実装されます。ただし、この動作はコンパイラに依存しており、実装ごとに異なる場合があります。
影響
推奨事項
コードの移植性についてまた、C 標準への準拠を確実にするために、次のサイズの配列を作成するために動的メモリ割り当て (例: new[]) を使用することをお勧めします。コンパイル時には不明です。
以上が標準では可変長配列 (VLA) が禁止されているにもかかわらず、g と clang が C で可変長配列 (VLA) を受け入れるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。