C头文件中的包含周期

时间:2008-11-07 23:30:09

标签: c include header

如何防止C中的包含周期?即。你不应该有一个#include“b.h”,其中#include的“c.h”是#include的“a.h”。我正在寻找一种方法来防止使用某种C指令发生这种情况。

我原本以为这会阻止这种情况发生:

a.h的内容:

#ifndef __A_H
#define __A_H

#include "b.h"

#endif // __A_H

b.h的内容:

#ifndef __B_H
#define __B_H

#include "c.h"

#endif // __B_H

c.h的内容:

#ifndef __C_H
#define __C_H

#include "a.h"

#endif // __C_H

但它似乎不起作用。

5 个答案:

答案 0 :(得分:7)

它确实可以正常工作:重复包含 文件,但#ifdndef / #define / #endif 保护的部分不会重复,这会打破周期

使用编译器生成预处理输出并自行查看。使用GNU CC,您需要在.c [pp]文件中使用“-E”选项,如下所示:

gcc -E $(CFLAGS) -o foo.i foo.cpp

答案 1 :(得分:1)

具有前导下划线的宏保留给预处理器/编译器。

尝试将__ * _ H更改为更标准的内容 我使用HAVE __ * _ H。

答案 2 :(得分:1)

那应该有用。它在您的示例中正确编写,并为我编译好。您是否在实际代码中输入了错误的内容,或者您​​看到的是其他问题?

不应该用__开头,因为它是为编译器和/或系统库保留的。为你的警卫尝试一些其他的名字。

答案 3 :(得分:1)

ya除了以上内容之外,如果您正在使用turbo c并且您正在使用这些源文件进行项目,那么请不要附加源文件中包含#included的头文件。即使这样,如果不是然后工作然后从命令提示符尝试它,因为一些编译器选项一次又一次地给出这些错误。如果头文件内容在#ifndef和#endif之间,那么即使你包含这两个文件也没有问题。所以尝试从项目中删除头文件,将它们保存在同一个目录中.bcos你没有指定环境我指定了turbo C,因为我在turbo C上面对这种情况,头文件#included在源文件中并附加到项目文件列表然后会出现“多重声明问题”。编译后(即使有错误)也可以转到外部命令行并转到存放该文件的目录,然后直接尝试使用filename.exe。

答案 4 :(得分:0)

这很有效。

为了确定,我实际上编译了一个test.c,其中包含带有3个头文件的a.h。

我验证了这适用于MSVC,Digital Mars和GCC的几个版本。