2
 header1.h   
        -----------------
        struct A{
        int a;
        B *b;
        };

    header2.h  
    -------------------
    #include"header1.h"

    typedef struct b{
    int aa;
    char bb;
    int cc;
    }B;

    main.c  
    --------------------
    #include<header2.h>

    main(){

    struct A *ace;
    ace = malloc(sizeof(struct A));
    ace->b = malloc(sizeof(B));
    }

問題: 基本的に、header1.h は header2.h で定義された構造体を使用する必要があります。

ジレンマ: header2.h には header1.h が含まれているため、header1.h に header2.h を含めると、循環依存関係が発生します。

いくつかの解決策: 問題を解決する 1 つの方法は、void ポインターを使用することですが、他の方法はありますか? 前方宣言を試みたのですが、「typedef を再定義しています」と表示されます。

4

3 に答える 3

4

だからあなたが持っている問題はポインタです

B *b;

これはポインターなので、これが何であるかを伝える限り、不完全な型は問題ありません。

typedef struct a {
    int a;
    struct B *b;
} A;

または、プロトタイプ フォームを使用することもできます。

struct B;
typedef struct a {
    int a;
    B *b;
};

コンパイラーは、ポインターが指しているタイプを知りたいだけです。つまり、ここでは、ポインターがどのように見えるかは、最初に逆参照を試み始めるまで、実際には気にしません。

于 2013-11-01T23:02:50.363 に答える