0

#ifndef A
#define A

#include "B.h"

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

#endif

溴化氢

#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

这是修复它的一种方法:

啊:

#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

:

#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

主.c:

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

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

问题是,为了sizeof()工作,它的参数必须是已知类型。在您的代码中,并且在您执行and in AandB时还不完全清楚。重新排列类型定义、文件包含和函数定义的顺序可以解决这个问题。sizeof(A)sizeof(B)InitA()InitB()

于 2012-07-16T13:49:46.380 回答
0

好的,让我们一步一步来。

让我们看看如果你想包含其中一个文件会发生什么,在这个例子中A.h

  • A.h会包括B.h
  • B.h将包括A.h,由于标头保护而将被跳过。
  • B.h使用A* a;where A 是未知类型,此时会出现编译错误。

您必须像这样转发声明类型:(struct A;B.hstruct 定义之前)。

类似的推理适用于其他文件 ( struct B;)

于 2012-07-16T13:06:57.070 回答