【问题标题】:C include guard [duplicate]C包括警卫[重复]
【发布时间】: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 的问题。

标签: c++ c include-guards


【解决方案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 文件。

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

        【讨论】:

          猜你喜欢
          • 2018-06-10
          • 2010-11-11
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-13
          相关资源
          最近更新 更多