1

不完全な配列型は、有名なStruct ハックで使用されており、c99 標準以降は許可されています。c99 標準より前では、これらは許可されていませんでした。私は標準を見ていましたが、結論を出すことができません:

不完全な配列型は構造の外で許可されていますか?(標準 C99 で見つけたすべての参照: 6.7.2.1.15 は、構造の最後の要素としてそれについて話します)。

次のプログラムは、標準に従ってコンパイルできますか?

int array[];
int main(){return 0;}

私の質問の2番目の部分は、これが許可されている場合、少なくとも1つの要素arrayを格納できることが保証されているということです。 int

4

1 に答える 1

3

次のプログラムは、標準に従ってコンパイルできますか?

はい、次のとおりです。

(C99, 6.9.2p5) "例 2 int i[]; を含む変換単位の最後で、配列 i がまだ不完全な型を持っている場合、暗黙の初期化子によって 1 つの要素が作成され、プログラムの起動時にゼロに設定されます。 ."

そう

int array[];
int main(){return 0;}

有効であり、次と同等です。

int array[1];
int main(){return 0;}

array(上記のように)次のような外部リンケージがある場合にのみOKであることに注意してください。

(C99、6.9.2p3) 「オブジェクトの識別子の宣言が暫定的な定義であり、内部リンケージがある場合、宣言された型は不完全な型であってはなりません。」

于 2013-03-09T15:29:20.977 に答える