static
角かっこの間のand *
(省略されたサイズ) を無視すると[]
、配列宣言子の構文は次のようになります (C99 TC3 (n1256) 6.7.5 p1; C11 (n1570) 6.7.6 p1 より):
direct-declarator: direct-declarator [ type-qualifier-listopt assignment-expressionopt ] [...]
したがって、次のような宣言
int foo[0,1];
構文エラーですが、
int foo[(0,1)];
許可されます (これは VLA であるため、ブロック スコープで)。
コンマを区切り記号として使用するとあいまいになるため、任意の式が許可されない場合があります。たとえば、関数呼び出しの引数は代入式でなければなりません。しかし、そのようなあいまいさがどのように引き起こされるのかはわかりません。
direct-declarator:
direct-declarator [ type-qualifier-listopt expressionopt ]
これは C 言語の厳密なスーパーセットを定義しますか? この文法があいまいな例はありますか?
C89 *)では構文に定数式(条件式) が必要だったため、C99 で VLA を許可するにはこれを変更する必要がありました。しかし、式ではなく代入式に変更された理由がわかりません。技術的な理由はありますか?
Gcc (およびおそらく他のコンパイラ) には、C 標準に追加される前に拡張機能として VLA がありました。他の拡張機能との競合も説明になる可能性がありますが、そのような拡張機能については知りません。Gcc 3.0.4 はint a[0,1];
(および を使用し-std=gnu89
て-traditional
) 受け入れますが、新しいバージョン (Gcc (Debian) 4.7.2-5 でテスト済み) は受け入れないため、これが原因である可能性は低いと思われます。
私が見る限り、この質問は型名の直接抽象宣言子にも同様に適用されます。
*)この C89 ドラフトによると、3.5.4.