C头文件#ifndef #include错误

C header file #ifndef #include error

我想知道如何将 C 头文件与#ifndef 和#include 一起使用。 假设我有这两个头文件:

headerA.h:

#ifndef HEADERA_H
#define HEADERA_H

#include "headerB.h"

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

#endif

headerB.h

#ifndef HEADERB_H
#define HEADERB_H

#include "headerA.h"

typedef struct foo{
    MyInt x;
} TFoo;

#endif

headerA.c

#include "headerA.h"

... some code ...

headerB.c

#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 等等。

您需要打破这种依赖关系,例如 而不是 headerA.h 中包含 headerB.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

直接掉线

#include "headerB.h"

来自文件 headerA.h