C头文件#ifndef #include错误

时间:2016-11-16 10:16:30

标签: c header include typedef ifndef

我试图找出如何使用#ifndef和#include的C头文件。 假设我有这两个头文件:

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 想要包含< strong> headerB.h ,#ifndef HEADERA_H为false =跳过包括。

这里的最佳做法是什么?我刚才读到,最佳做法是在头文件中执行所有#include指令,但在这种情况下,它看起来像是一个问题。

编辑:好的,抱歉误导你。这只是具有更多文件的更大项目的例子。

2 个答案:

答案 0 :(得分:1)

您有循环依赖。标题文件headerA.h取决于headerB.h,这取决于headerA.h,依此类推。

您需要打破这种依赖关系,例如 not ,包括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

答案 1 :(得分:0)

只需删除该行

即可
#include "headerB.h"

来自文件headerA.h