C递归头文件包含问题?

时间:2010-09-22 12:01:15

标签: c recursion header include

假设您必须在2个头文件中定义相关结构,如下所示:

a.h内容:

#include b.h

typedef struct A
{
  B *b;
} A;

b.h内容:

#include a.h

typedef struct B
{
  A *a;
} B;

在这种情况下,这种递归包含是一个问题,但是2个结构必须指向其他结构,如何实现呢?

4 个答案:

答案 0 :(得分:4)

不要#include a.h和b.h,只需向前声明A和B.

A.H:

struct B; //forward declaration
typedef struct A
{
    struct B * b;
} A;

b.h:

struct A; //forward declaration
typedef struct B
{
    struct A * a;
} B;

您可能想要考虑类的紧密耦合程度。如果它们非常紧密耦合,那么它们可能属于同一个标题。

注意:#include文件中的{h}和b.h都需.c来执行a->b->a之类的操作。

答案 1 :(得分:2)

您只预先定义了结构,这样您仍然可以声明一个指针:

a.h

typedef struct B_ B;

typedef struct A_
{
  B *b;
} A;

请注意我如何为typedef和struct标记使用单独的名称,以使其更清晰。

答案 2 :(得分:2)

Google C/C++ guidelines suggests

  

当前向声明足够

时,不要使用#include

那意味着:

a.h内容:

typedef struct B B;

typedef struct A
{
  B *b;
} A;

b.h内容:

typedef struct A A;

typedef struct B
{
  A *a;
} B;

如果您更喜欢更安全(但编译时间更长),您可以这样做:

a.h内容:

#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;

b.h内容:

#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;

答案 3 :(得分:1)

这将在C:

中删除它
typedef struct B B;
typedef struct A A;
struct A { B *b; };
struct B { A *a; };

您可以根据需要重新排列BA