2

2 つのヘッダー ファイル (headerfile_1.h と headerfile_2.h) でこのようなことをすると、次のエラーが表示されます: エラー C2016: C では、構造体または共用体が構造体から少なくとも 1 つのメンバーを持っている必要があります。

headerfile_1.h 内

#include "headerfile_2.h"
struct a;

struct a{
    B bb;
}A;

headerfile_2.h 内

typedef struct b{
  void (*func0)(A *aa);
}B;

どこが間違っているのか、理解してください。ありがとう。

4

2 に答える 2

5

2 つのヘッダー ファイル間に循環依存関係があるため、実行しようとしていることが機能しません。

ヘッダーファイル_1:

struct A{
    B bb;  /* Use of B, therefore B needs to be defined before A */
};

ヘッダファイル_2:

typedef struct b{
    void (*func0)(A a); /* Use of A, therefore A needs to be defined before B */
} B;

不可能。

できることの 1 つは、 の定義を変更して、完全なオブジェクトではなくfunc0ポインタを取得することです。このように、 beforeAの定義は本当に必要ありません。AB

したがって:

ヘッダーファイル_1:

#include "headerfile_2.h"

struct A{
    B bb;
};

ヘッダファイル_2:

typedef struct A A;

typedef struct b{
    void (*func0)(A *a); /* A * instead of A */
} B;
于 2012-04-05T16:07:23.297 に答える
0

あなたが与えたコードは、さまざまな場所で間違っていました。私はあなたがになりたかっAtypedefと思いますstruct aか?

typedef最も簡単な方法は、 as forward 宣言を常に1 つのヘッダー ファイルに入れることです。

typedef struct a A;
typedef struct b B;

次に、自分自身の宣言をstruct正しい順序で( other なしでtypedef)行う必要があります。ここでstruct bはポインタが必要なだけなAので、上記だけで問題ありませんtypedef。しかし、ポインターだけでなくstruct a全体が必要なので、 の宣言は の宣言全体を参照する必要があります。Bstruct astruct b

于 2012-04-05T19:03:56.360 に答える