C递归头文件包含问题?

who*_*hoi 6 c recursion header include

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

啊内容:

#include b.h

typedef struct A
{
  B *b;
} A;
Run Code Online (Sandbox Code Playgroud)

bh内容:

#include a.h

typedef struct B
{
  A *a;
} B;
Run Code Online (Sandbox Code Playgroud)

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

Dou*_*oug 5

不要#include ah 和 bh,只需前向声明 A 和 B。

啊:

struct B; //forward declaration
typedef struct A
{
    struct B * b;
} A;
Run Code Online (Sandbox Code Playgroud)

乙:

struct A; //forward declaration
typedef struct B
{
    struct A * a;
} B;
Run Code Online (Sandbox Code Playgroud)

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

注意:您需要#include在文件中同时使用 ah 和 bh.c才能执行a->b->a.


Wer*_*ght 4

Google C/C++ 指南建议:

当前向声明就足够时,不要使用#include

那意味着:

啊内容:

typedef struct B B;

typedef struct A
{
  B *b;
} A;
Run Code Online (Sandbox Code Playgroud)

bh内容:

typedef struct A A;

typedef struct B
{
  A *a;
} B;
Run Code Online (Sandbox Code Playgroud)

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

啊内容:

#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
Run Code Online (Sandbox Code Playgroud)

bh内容:

#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;
Run Code Online (Sandbox Code Playgroud)