c forward declare(尝试像c ++但没有工作)

时间:2012-07-16 12:59:12

标签: c forward-declaration

A.H

#ifndef A
#define A

#include "B.h"

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

#endif

B.h

#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在类型之间产生冲突错误,之前的声明就在这里等等。

感谢。

2 个答案:

答案 0 :(得分:1)

这是修复它的一种方法:

A.H:

#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

b.h:

#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()起作用,其参数必须是已知类型。在AB中执行sizeof(A)sizeof(B)时,您的代码InitA()InitB()尚不完全清楚。重新排列类型定义,文件包含和函数定义的顺序可以解决这个问题。

答案 1 :(得分:0)

好的,我们一步一步走。

让我们看看如果您想要包含其中一个文件会发生什么情况,例如:A.h

  • A.h将包含B.h
  • B.h将包含A.h,由于标题保护而会被跳过。
  • B.h使用A* a;,其中A是未知类型,此时您将收到编译错误。

你必须转发声明这样的类型:struct A;(在B.h中,在结构定义之前)。

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