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
我想知道如何将 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