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包括警卫[重复]的主要内容,如果未能解决你的问题,请参考以下文章