0

ああ

#ifndef A
#define A

#include "B.h"

typedef struct {
    B* b;
} A;
void InitA(A* a) {
    a->b=malloc(sizeof(B));
}

#endif

Bh

#ifndef B
#define B

#include "A.h"

typedef struct {
    A* a;
} B;
void InitB(B* b) {
    b->a=malloc(sizeof(A));
}

#endif

私はc++やtypedefのようにそのように試しました。typedefはタイプ間で競合エラーを発生させ、以前の宣言はここにありました。

ありがとう。

4

2 に答える 2

1

これを修正する1つの方法は次のとおりです。

ああ:

#ifndef A_H_
#define A_H_

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

#include "b.h"

void InitA(A* a)
{
  a->b = malloc(sizeof(B));
}

#endif

bh:

#ifndef B_H_
#define B_H_

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

#include "a.h"

void InitB(B* b)
{
  b->a = malloc(sizeof(A));
}

#endif

main.c:

#include <stdlib.h>
#include "a.h"
#include "b.h"

int main(void)
{
  A a;
  B b;
  InitA(&a);
  InitB(&b);
  return 0;
}

問題は、機能するためsizeof()には、そのパラメータが既知のタイプでなければならないことです。あなたのコードAでは、あなたがそうするとき、そしてあなたがそうするとき、そしてまだB完全には知られていない。タイプ定義、ファイルインクルード、関数定義の順序を並べ替えると、それを修正できます。sizeof(A)sizeof(B)InitA()InitB()

于 2012-07-16T13:49:46.380 に答える
0

さて、ステップバイステップで行きましょう。

この例では、ファイルの1つを含めたい場合に何が起こるか見てみましょうA.h::

  • A.h含まれますB.h
  • B.hが含まれますA.hが、ヘッダーガードのためにスキップされます。
  • B.hAが不明なタイプである場合に使用A* a;します。この時点で、コンパイルエラーが発生します。

次のように型を前方宣言する必要があります:(struct A;構造B.h体定義の前ので)。

同様の理由が他のファイルにも当てはまります(struct B;

于 2012-07-16T13:06:57.070 に答える