2012-11-29 8 views
16

これから拡張するquestionこれはどのような宣言ですか?

このコードを理解するのは苦労しています。

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のこの現象に関するご意見はありますか?私はそれがどこにあっても見つけられなかった。 myfooと呼ばれるタイプfooのC変数の定義である

+0

に等しい と私はC99標準を見て機会がなかったので、それはだ場合、私はまだわからない翻訳単位の終わりのように複合型、どこかで指定された+1。 – iabdalkader

+0

@melpomene:私は – Omkant

+0

@melpomeneに合意しましたか?後で同じファイルにその構造が定義されていることを理解しているようです。 – Shahbaz

答えて

16

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

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

[email protected]:~$ cat tst.c 
struct foo myfoo; 

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

int main() 
{ 
} 
[email protected]:~$ clang tst.c 
tst.c:1:12: error: tentative definition has type 'struct foo' that is never 
     completed 
struct foo myfoo; 

私はそのgccのバグ、打ち鳴らすだけでなく、comeau onlineがコードをコンパイルしているとは思いません。

$ 6.9.2/2

ストレージクラス指定せずに、または静的ストレージクラス指定子で初期化することなく、範囲ファイル持つオブジェクトに対する識別子の宣言、及び は、構成 仮定義。翻訳単位に 識別子の仮定義が1つ以上含まれていて、その翻訳単位にその識別子の外部定義が含まれていない場合、その動作はまさに翻訳単位に 識別子のファイルスコープ宣言が含まれているかのようです。初期化子0


+4

良いキャッチ、C99 6.9.2/2。これは難しいものでした(一般的にC++に慣れているとき)。 – netcoder

+0

標準で構造体について言及していないのは面白いです(C11ではなく)。 – Shahbaz

-2
struct foo myfoo; 

。 Cでは、structを変数宣言の前に明示的に記述する必要があります。

コンパイラがあなたのmyfooを定義した場所に何の考えもないので、あなたのコードはコンパイルしないでください。fooのタイプはどのように見えますか?コンパイラはfooが不完全な型であると不平を言うべきです。

EDIT:これは仮定義と呼ばれることになる、

スクラップ。

+5

私はあなたが完全に質問を読むとは思わない。 – Shahbaz

+0

暫定的な定義は§6.9.2/ 2の「翻訳単位の終わりの複合型」になりますが、私はこれが質問にあると思います。 – Mat

+0

どのような "互換モード"ですか?暫定的な定義はC標準で記述されています。 – Mat

関連する問題