16

この質問からの拡張

このコードを理解するのに問題があります。

struct foo myfoo;  // --> Is it forward declaration or object creation. ?

struct foo
{
 int a;
};

int main()
{

return 0;
}

矢印でマークされたコードで-->は、前方宣言またはオブジェクトの作成ですか。?

それが前方宣言である場合、何とstruct foo;呼ばれますか?オブジェクトの作成またはインスタンス化の場合、構造体定義の前にどのようにオブジェクトを作成できますか。

コンパイラでは正常gccに動作しますが、他のコンパイラではエラーが発生します。

gcc -Werror -Wall tst.c -o tst

?のこの振る舞いについての提案や説明はありgccますか?文書化されているように、どこにも見つかりませんでした。

4

2 に答える 2

16

の暫定的な定義のように見えmyfooますが、構造体の定義が提供されているため、エラーは発生しません。

clangは、タイプが定義されていない場合に包括的な診断を提供します。

prasoon@ats-VPCEB3AGG:~$ cat tst.c
struct foo myfoo;

//struct foo{
//  int x ;
//} ;

int main()
{
}
prasoon@ats-VPCEB3AGG:~$ clang tst.c
tst.c:1:12: error: tentative definition has type 'struct foo' that is never
      completed
struct foo myfoo;

gccのバグ、clang、 comeauonlineがコードをコンパイルしているとは思いません。

$ 6.9.2 / 2

初期化子がなく、ストレージクラス指定子がないか、ストレージクラス指定子が静的であるファイルスコープを持つオブジェクトの識別子の宣言は、暫定的な定義を構成します。翻訳ユニットに識別子の1つ以上の仮定義が含まれ、翻訳ユニットにその識別子の外部定義が含まれていない場合、動作は、翻訳ユニットにその識別子のファイルスコープ宣言が含まれている場合とまったく同じです。 0に等しい初期化子を使用して、変換単位の終わりの。


于 2012-11-29T14:36:15.487 に答える
-2
 struct foo myfoo; 

fooこれは、と呼ばれる型のC変数定義ですmyfoo。Cでは、変数宣言structの前に明示的に指定する必要があります。struct

myfooこれで、コンパイラは、定義した場所で、どのタイプがどのように見えるかを認識できないため、コードをコンパイルしないでくださいfoo。コンパイラはfoo、不完全な型であることについて文句を言う必要があります。

編集:

それを捨てて、これは暫定的な定義と呼ばれるでしょう。

于 2012-11-29T14:31:37.730 に答える