我试图弄清楚如何在#ifndef和#include中使用C标头。
可以说我有以下两个头文件:

标头A.h:

#ifndef HEADERA_H
#define HEADERA_H

#include "headerB.h"

typedef int MyInt;
TFoo foo;
... some other structures from headerB.h ...

#endif


头文件

#ifndef HEADERB_H
#define HEADERB_H

#include "headerA.h"

typedef struct foo{
    MyInt x;
} TFoo;

#endif


标头A.c

#include "headerA.h"

... some code ...


头文件

#include "headerB.h"

... some code ...


编译headerB.c时说

In file included from headerB.h,
                 from headerB.c:
headerA.h: error: unknown type name ‘MyInt’


我认为,这是因为headerB.h编译时,它定义了HEADERB_H,然后,当headerA.h要包含headerB.h时,#ifndef HEADERA_H为false =跳过包含。

最佳做法是什么?我刚刚读到,最佳实践是在头文件中执行所有#include指令,但是在这种情况下,这似乎是一个问题。

编辑:好的,很抱歉误导您。这只是来自具有更多文件的更大项目的示例。

最佳答案

您具有循环依赖关系。头文件headerA.h取决于headerB.h,而headerA.h取决于headerB.h等等。

您需要打破这种依赖性,例如,在headerA.h中不包括headerA.h。不需要(headerB.h中的任何内容都不需要headerB.h中的任何内容)。



如果必须包括MyInt(如最近的编辑所述),则首先应重新考虑如何使用头文件以及在何处放置什么定义。也许将headerB.h的定义移至MyInt?还是有更多的头文件,例如一个用于类型别名(例如您个人认为没有用的),一个用于结构和一个用于变量声明?

如果无法实现,则可以尝试更改定义和包含的顺序,例如

#ifndef HEADERA_H
#define HEADERA_H

// Define type alias first, and other things needed by headerB.h
typedef int MyInt;

// Then include the header file needing the above definitions
#include "headerB.h"

TFoo foo;
... some other structures from headerB.h ...

#endif

07-24 13:53