我试图弄清楚如何在#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