C包括警卫[重复]

Posted

技术标签:

【中文标题】C包括警卫[重复]【英文标题】:C include guard [duplicate] 【发布时间】:2011-11-25 11:48:52 【问题描述】:

file1.c 首次包含inc.h(包含包含保护#ifndef INC_H)时,将执行#define INC_H。但是现在,当另一个file2.c 包含相同的inc.h 时,宏INC_H 是否已经定义,都是同一个故事,之前的定义不在这里传播?

【问题讨论】:

这个问题可以使用大量的sample code,其中一些是完整而简洁的。 很明确,不需要示例代码。 @James:不够明确。您尚未指定是分别编译这两个 C 文件还​​是作为单个编译单元编译。 @BrettHale:一旦你学会了一点 C 语言并思考了一下,常识就会回答这个问题。 大部分情况下,我不太懂英语。示例代码应该清楚地说明 James 的问题。 【参考方案1】:

在单独的编译之间不保留宏定义。

【讨论】:

【参考方案2】:

但是现在,当另一个file2.c包含相同的inc.h时,宏INC_H是否已经定义,

是和否。这取决于。

如果file2.c 包含一些包含inc.h 的标头,则INC_H 已为file2.c 定义。这适用于任何级别的包容性。

否则,尚未定义。

Guards 防止文件头多次间接或直接包含在文件中!

【讨论】:

它与另一个声称相矛盾的答案相矛盾,即不同 *.c 文件的两个编译不共享任何新定义。 哦,不,快读。第一个项目符号是file2.c <- other.h <- inc.h,对吗?那么这个答案是绝对严谨的。对不起。 @James:是的,没错。 :-)【参考方案3】:

当您编译 file2.c 时,编译器会重新启动。在编译file1.c 时定义的任何预处理器符号在file2.c 的编译过程中都不起作用。

【讨论】:

【参考方案4】:

定义不会在*.c 文件之间传播。如果是这样,您首先就不需要*.h 文件。 (不过,你可以#include *.c 文件,但那是另一回事了。)

【讨论】:

【参考方案5】:

不,想一想“#include”的作用。它本质上是将头文件的内容复制到包含它的位置。

所以INC_H 将在inc.h 第一次包含在.c 文件中时被定义。但是,这不会改变另一个 .c 文件。

当包含文件中包含其他包含时,包含保护很有用。在这些情况下,您可以避免使用防护装置的麻烦。

【讨论】:

以上是关于C包括警卫[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 包括警卫

犯错误:多个定义...尽管包括警卫

如何解决 C++ 中针对 AST 上的访问者模式的标头重复问题

包括声明之外包括警卫

包括问题和包括警卫

使用“#define FOO”而没有分配任何值——除了包括警卫之外?