1

如何防止 C 中的包含循环?IE。你不应该有 ah #include "bh",其中 #include 的 "ch" 和 #include 的 "ah"。我正在寻找一种使用某种 C 指令来防止这种情况发生的方法。

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

内容啊:

#ifndef __A_H
#define __A_H

#include "b.h"

#endif // __A_H

bh的内容:

#ifndef __B_H
#define __B_H

#include "c.h"

#endif // __B_H

ch的内容:

#ifndef __C_H
#define __C_H

#include "a.h"

#endif // __C_H

但这似乎不起作用。

4

5 回答 5

7

它确实可以正常工作:文件重复包含,但受#ifdndef/#define/#endif 保护的部分重复,这打破了循环。

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

gcc -E $(CFLAGS) -o foo.i foo.cpp
于 2008-11-07T23:36:43.017 回答
1

带有前导下划线的宏是为预处理器/编译器保留的。

尝试将 __*_H 更改为更标准的内容。
我使用 HAVE__*_H。

于 2008-11-07T23:37:40.080 回答
1

那应该行得通。它在您的示例中正确编写并且对我来说编译得很好。您是否在实际代码中打错了某些内容,或者您​​确实遇到了其他问题?

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

于 2008-11-07T23:38:08.410 回答
1

除了上述内容之外,如果您正在使用 turbo c 并且正在使用这些源文件进行项目,则不要附加源文件中#included 的头文件。即使这样,如果它不起作用,请尝试它来自命令提示符,因为一些编译器选项一次又一次地给出这些错误。所以如果头文件内容在#ifndef和#endif之间,那么即使你包含这两个文件也不会有问题。所以尝试从项目中删除头文件,将它们保留在同一目录中。bcos 你没有指定环境,我指定了 turbo C,因为我曾经在 turbo C 上遇到过这种情况,头文件#included 在源文件中并附加到项目文件列表中那么就会出现“多重申报问题”。

于 2008-11-12T11:30:28.737 回答
0

这行得通。

可以肯定的是,我实际上编译了一个 test.c,其中包含 ah 和你的 3 个头文件。

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

于 2008-11-07T23:39:44.443 回答