ホームページ > バックエンド開発 > C++ > 標準では可変長配列 (VLA) が禁止されているにもかかわらず、g と clang が C で可変長配列 (VLA) を受け入れるのはなぜですか?

標準では可変長配列 (VLA) が禁止されているにもかかわらず、g と clang が C で可変長配列 (VLA) を受け入れるのはなぜですか?

Patricia Arquette
リリース: 2024-12-30 09:06:17
オリジナル
153 人が閲覧しました

Why Do g   and clang   Accept Variable Length Arrays (VLAs) in C   Despite the Standard Prohibiting Them?

非標準ステータスにもかかわらず C で可変長配列 (VLA) を受け入れる

C は可変長配列 (VLA) を正式にサポートしていませんが)、g コンパイラと Clang コンパイラは両方とも、驚くべきことにそれらを有効な構文として受け入れます。これにより、コンパイラの動作と VLA に対する標準の立場について疑問が生じます。

コンパイラの受け入れ

g や Clang などの C コンパイラは、VLA を非標準拡張として許可します。これは、そのような宣言を許可していた古い C コンパイラとの歴史的な互換性によるものと考えられます。

標準定義

C 標準では、[dcl.配列]。配列サイズの指定には定数式のみが許可されます。提供されているコード例では、n は定数式ではないため、標準に従って VLA 宣言は無効になります。

実装の詳細

VLA は非標準であるにもかかわらず、 C では、多くの場合、スタック上にメモリを割り当て、ループを使用して要素にアクセスすることによって実装されます。ただし、この動作はコンパイラに依存しており、実装ごとに異なる場合があります。

影響

  • C の VLA はコンパイラ拡張とみなされ、依存すべきではありません。 .
  • VLA を含むコードは、コンパイラによって異なる動作を示す場合があります。
  • 異なる C コンパイラ間での移植性を目的としたコードで VLA を使用することはお勧めできません。

推奨事項

コードの移植性についてまた、C 標準への準拠を確実にするために、次のサイズの配列を作成するために動的メモリ割り当て (例: new[]) を使用することをお勧めします。コンパイル時には不明です。

以上が標準では可変長配列 (VLA) が禁止されているにもかかわらず、g と clang が C で可変長配列 (VLA) を受け入れるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート