18

C11標準で匿名構造体が追加されたので、

typedef struct { 
    struct {int a, b};
    int c; 
} abc_struct;

有効かつ標準です。完全な構造体宣言の代わりに typedef を使用することも標準内ですか? 例えば:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;

GCC のドキュメントによると、これは Plan 9 の拡張機能ですが、私が試したいくつかのコンパイラ (GCC を含む...) で動作します。標準自体を読む限り、問題ないと思います。

4

3 に答える 3

13

gccこれは明らかに、チームのジョセフ S. マイヤーズが C 委員会に質問したものです。答えはノーです。C11 では有効ではありません。

ここで答えを見てください:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

そしてマイヤーズのコメント:

今週のロンドン WG14 ミーティングは、N1549 に従って、無名の構造体および共用体フィールドを宣言する際に typedef の使用を禁止することに合意しました。

ソースhttp://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

この質問は SC22WG15.12205 で行われました。http: //www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf の 5.28 SC22WG14.12205、匿名構造 (N1425)を参照してください。

于 2012-02-04T16:23:35.880 に答える
4

-fplan9-extensions実際、2 番目のスニペットは危険に満ちており、gcc で明示的に指定しない限り、最初のスニペットと同等ではありません。

特に ab_struct; 6 行目の宣言は何もしません (gcc 警告に従って)。2 番目のスニペットを foo.c に貼り付けるだけで、次が生成されます。

foo.c:6: warning: declaration does not declare anything

特に、次のことを試す場合:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}

abc.a = 5;.を使用しないと、13 行目で構文エラーが発生します-fplan9-extensio

一方、一番上のスニペットを使用すると、匿名構造はあなたが考えているように機能します。すなわち:

typedef struct { 
    struct { 
            int a, b;
    };
        int c; 
} abc_struct;


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}
于 2012-02-04T16:48:39.067 に答える
0

申し訳ありませんが、私はまだ完成した標準を取得していませんが、最終草案には次のように書かれています。

  • 型指定子がタグのない構造指定子である名前のないメンバーは、匿名構造体と呼ばれます。型指定子がタグのない共用体指定子である名前のないメンバーは、無名共用体と呼ばれます。

私はそれのみを解釈するstruct {};ことunion {};ができ、匿名の構造体/共用体にすることができます。

于 2012-02-04T16:22:57.783 に答える