可変長配列と定数式
以下に示す C コードの断片は、特定のコンパイラで正常にコンパイルできる可能性があります。
C 標準 (8.3.4/1) によれば、このコードは次のようになります。配列 (arr) のサイズは定数式である必要があるため、拒否されることが予想されます。ただし、gcc 4.8 や Clang 3.2 などのコンパイラの動作について疑問が生じます。
このシナリオでは可変長配列 (VLA) が登場します。 VLA は、 gcc と Clang が C 内の拡張機能として実装した C99 機能です。ただし、この場合、Visual Studio は標準に厳密に従います。生成されるメッセージ:
は、サイズをゼロとして正当に解釈することを示しますが、これはこのコンテキストでは許可されていません。
gcc と Clang の両方で -pedantic フラグを有効にすると、を選択すると、VLA の使用に関する警告が表示されます。たとえば、gcc は次のように述べています:
さらに、-pedantic-errors フラグを使用すると、この使用法はエラーになります。サポートされている言語標準の詳細については、提供されているドキュメントを参照してください。
ドラフト C 標準では、5.19 (定数式) で整数定数式が次のように定義されています。
「整数定数式は、整数またはスコープ外の列挙型の式。暗黙的に prvalue に変換されます。変換された式はコア定数式です。
準拠を達成するには標準では、const (または constexpr) を使用してサイズをリテラルで初期化できます。これにより、サイズが整数の定数式になります:
C99 ドラフト標準 (6.7.5.2) の対応するセクションでは、サイズが存在しない場合は不完全な配列型が宣言されることが明確になっています。サイズが * の場合、可変長配列型は長さが定義されていない状態で作成され、特定のコンテキストでのみ使用できます。それ以外の場合は、式のプロパティに基づいて、通常の配列型または可変長配列型のいずれかになります。
以上が一部のコンパイラでは C の可変長配列が許可されるのに、他のコンパイラでは許可されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。