我试图找出如何使用#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
指令,但在这种情况下,它看起来像是一个问题。
编辑:好的,抱歉误导你。这只是具有更多文件的更大项目的例子。
答案 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