2012-07-08 10 views
8

私は、ヘッダーファイルに次の宣言があります:前方宣言がなければ前方宣言の副作用を持つtypedef?

struct my_struct; 
int func(struct my_struct* s);  // Passing struct my_struct* 

を、コンパイラは明らかにthis errorを与えるだろう:

error: 'struct my_struct' declared inside parameter list

しかし、私は交換した場合my_structをtypedefで前方宣言し、それに応じて関数宣言を更新すると、compiles fine

typedef struct my_struct my_struct_t; 
int func(mystruct_t* s);    // Passing my_struct_t* 

不思議なことに、私は、typedefのを維持するが、元の宣言my_structを使用している場合、それalso compiles

typedef struct my_struct my_struct_t; 
int func(struct my_struct* s);  // Passing struct my_struct* 

は、誰がそれを 気づきましたか?その行動は副作用ですか?セクション6.2.1では

+2

typedefも前方宣言として機能し、型名をスコープに持ち込みます。 –

+0

@ダニエルフィッシャーはい、私はそれに気付いています:)しかし、私はそれを述べている標準で何も見つけることができませんでした。私は何か見落としてますか? –

+0

構造体へのポインタを作成するための前方宣言は必要ありません。それは単なる大会です。私が間違っている? –

答えて

7

、第7項:

構造体、共用体、列挙型のタグは、単にタグを宣言タイプ特異的ERにおける タグの出現後に開始範囲を持っています。各列挙定数には、列挙子リストにその定義列挙子が出現した直後に が始まるスコープがあります。 他の識別子は、その宣言子の完了直後に開始するスコープを持ちます。

そして6.7.2.3において、パラグラフ8:

形態 構造体、または、組合識別子 のタイプ特異的ERは、上記のいずれかの形式の一部として以外に発生し、無場合タグとしての 識別子の他の宣言が表示された後、不完全な構造体または共用体型が宣言され、 はその識別子をその型のタグとして宣言します。

したがって、typedefは、不完全な構造タイプを宣言します。

+0

+1美しい!どうもありがとう! –