C递归头文件包含问题?
假设您必须在2个头文件中定义相关结构,如下所示: a、 h内容: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
#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
,它将只应用一次声明。否则你会有编译错误。