C递归头文件包含问题?

C递归头文件包含问题?,c,recursion,header,include,C,Recursion,Header,Include,假设您必须在2个头文件中定义相关结构,如下所示: a、 h内容: #include b.h typedef struct A { B *b; } A; #include a.h typedef struct B { A *a; } B; typedef struct B B; typedef struct A { B *b; } A; typedef struct A A; typedef struct B { A *a; } B; #pragma once ty

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

a、 h内容:

#include b.h

typedef struct A
{
  B *b;
} A;
#include a.h

typedef struct B
{
  A *a;
} B;
typedef struct B B;

typedef struct A
{
  B *b;
} A;
typedef struct A A;

typedef struct B
{
  A *a;
} B;
#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;
b、 h内容:

#include b.h

typedef struct A
{
  B *b;
} A;
#include a.h

typedef struct B
{
  A *a;
} B;
typedef struct B B;

typedef struct A
{
  B *b;
} A;
typedef struct A A;

typedef struct B
{
  A *a;
} B;
#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;

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

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

a.h
中:

typedef struct B_ B;

typedef struct A_
{
  B *b;
} A;
请注意,我是如何为
typedef
和struct标记使用单独的名称的,以使其更加清晰。

这将在C中对其进行剪切:

typedef struct B B;
typedef struct A A;
struct A { B *b; };
struct B { A *a; };
您可以根据需要重新排列
B
A

不包括A.h和B.h,只需向前声明A和B

a、 h:

b、 h:

您可能需要考虑这些类之间的耦合有多紧密。如果它们是紧密耦合的,那么它们可能属于同一个标题

注意:您需要在
.c
文件中同时包含
a.h和b.h,才能执行
a->b->a
:

当转发声明足够时,不要使用#include

这意味着:

a、 h内容:

#include b.h

typedef struct A
{
  B *b;
} A;
#include a.h

typedef struct B
{
  A *a;
} B;
typedef struct B B;

typedef struct A
{
  B *b;
} A;
typedef struct A A;

typedef struct B
{
  A *a;
} B;
#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;
b、 h内容:

#include b.h

typedef struct A
{
  B *b;
} A;
#include a.h

typedef struct B
{
  A *a;
} B;
typedef struct B B;

typedef struct A
{
  B *b;
} A;
typedef struct A A;

typedef struct B
{
  A *a;
} B;
#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;

如果您更喜欢更安全(但编译时间更长)的内容,可以执行以下操作:

a、 h内容:

#include b.h

typedef struct A
{
  B *b;
} A;
#include a.h

typedef struct B
{
  A *a;
} B;
typedef struct B B;

typedef struct A
{
  B *b;
} A;
typedef struct A A;

typedef struct B
{
  A *a;
} B;
#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;
b、 h内容:

#include b.h

typedef struct A
{
  B *b;
} A;
#include a.h

typedef struct B
{
  A *a;
} B;
typedef struct B B;

typedef struct A
{
  B *b;
} A;
typedef struct A A;

typedef struct B
{
  A *a;
} B;
#pragma once
typedef struct A A;

#include "B.h"

typedef struct A
{
  B *b;
} A;
#pragma once
typedef struct B B;

#include "A.h"

typedef struct B
{
  A *a;
} B;

只是出于好奇,什么是
#pragma once
?这是一种新的方式(几乎所有编译器都支持)来执行
#ifndef my#u HEADER#H#define my#u HEADER#H#H##endif
。这意味着,如果您有两次“include”foo.h,而foo.h有一次
#pragam
,它将只应用一次声明。否则你会有编译错误。