2

gcc では、次のように無名構造体を作成できます。

struct test2 {
    struct {
            int x;
            int y;
    };
    int z;
};

しかし、匿名構造体の定義済みバージョンで同じことをしようとすると、失敗します。

struct test1 {
    int x;
    int y;
};

struct test2 {
    struct test1;
    int z;
};

これを行う理由は、C クラスの「メンバー関数」に対応する一連の関数ポインターを含む構造体を定義したいからです。構造体を匿名で含めないと、次のような厄介なことをしなければならなくなります。

object->API->function(object,...);

これは、私がする必要があるいくつかのことではうまくいきません(たとえば、「object.API」は「object」と一致しないため、オブジェクトの非表示をサポートする他の言語からの自動バインディングを行うことが困難または不可能になりますオブジェクト ポインタ)。

現時点では、関数をコピーして貼り付けるだけですが、これは面倒でエラーが発生しやすくなります。C プリプロセッサを使用することもできましたが、多数の関数プロトタイプを含むマクロを作成するのは見苦しく思えます。

4

1 に答える 1

5

struct test1構造体の型の名前です。フィールドの名前がありません (インラインで定義された構造体または共用体以外の「匿名」フィールドを持つことはできません)。

struct test2 {
    struct test1 myStructTest1;
    int z;
};

編集:どうやらそれを可能にするGCC拡張機能があります:-fms-extensions

-fms-extensions が使用されない限り、名前のないフィールドは、タグのない構造体または共用体の定義でなければなりません (たとえば、struct { int a; };'). If -fms-extensions is used, the field may also be a definition with a tag such asstruct foo { int a; };'、以前に定義された構造体または共用体への参照、`struct foo;' など)。 '、または以前に定義された構造体または共用体型の typedef 名への参照。

 struct s1 { int a; };
 struct s2 { struct s1; };
于 2012-06-15T18:08:20.813 に答える