假设您必须在2个头文件中定义相关结构,如下所示:
a.h内容:
#include b.h
typedef struct A
{
B *b;
} A;
b.h内容:
#include a.h
typedef struct B
{
A *a;
} B;
在这种情况下,这种递归包含是一个问题,但是2个结构必须指向其他结构,如何实现呢?
答案 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; };
您可以根据需要重新排列B
和A
。