8

ヘッダーファイルに次の宣言があります。

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

前方宣言がないと、コンパイラは明らかにこのエラーを出します。

error: 'struct my_struct' declared inside parameter list

ただし、の前方宣言をmy_structtypedefに置き換え、それに応じて関数宣言を更新すると、正常にコンパイルされます

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

不思議なことに、typedefを保持しているが、元の宣言my_structを使用すると、コンパイルも行われます

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

他の誰かがそれに気づきましたか?その行動は副作用ですか?

4

1 に答える 1

7

セクション6.2.1、パラグラフ7:

構造体、共用体、および列挙型のタグには、タグを宣言する型指定子にタグが出現した直後から始まるスコープがあります。各列挙定数には、列挙子リストに定義する列挙子が表示された直後から始まるスコープがあります。他の識別子には、宣言子の完了直後に開始するスコープがあります。

そして6.7.2.3のパラグラフ8:

フォームstruct-or-union識別子の型指定子が上記のフォームの一部として以外に発生し、タグとしての識別子の他の宣言が表示されない場合、不完全な構造体または共用体型を宣言し、宣言しますそのタイプのタグとしての識別子。

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

于 2012-07-08T13:34:10.090 に答える