【问题标题】:Multiple #ifndef statements - which one gets applied多个 #ifndef 语句 - 应用哪一个
【发布时间】:2018-10-23 00:51:54
【问题描述】:

假设我有五个文件:main.c, sample1.c, sample1.h, sample2.csample2.h,其中每个文件中的DEBUG_PRINTS 定义如下:

#ifndef DEBUG_PRINTS
#define DEBUG_PRINTS 0
#endif

并且代码是使用 gcc 编译的:

gcc -Wall main.c sample1.c sample2.c -o main

现在我将一个文件中DEBUG_PRINTS 的值更改为1。如果不打印到终端,您如何确定将应用哪个值?

此外,如何在每个文件本地定义 DEBUG_PRINTS - 与对变量使用 static 关键字一样?

【问题讨论】:

    标签: c gcc ifndef


    【解决方案1】:

    每个文件都是单独编译的。一个文件中的宏在任何其他文件中都不可见。文件独立编译后,生成的对象将链接在一起以创建可执行文件。

    【讨论】:

    • 如果我错了,请纠正我:编译器首先定义源文件中列出的宏,然后从第一个包含的头文件中导入所有宏,然后是第二个头文件,依此类推。按照这个顺序,它将应用遇到的第一个 DEBUG_PRINTS 定义,并且所有其他 #ifndef(在随后的头文件中)都将被转义。
    • 没有。编译器按顺序读取文件。当它看到#define 时,它定义了宏。当它看到#include 时,它会读取包含的文件。只需一次通过。当它看到当前定义的宏时,它会使用当前定义。 (您使用#undef 取消设置宏,然后重新定义它。所以顺序很重要。)
    • @alexander,在这种情况下,第一个包含的文件中DEBUG_PRINTS 的定义将“获胜”是正确的,除非您在主文件中定义符号之前 包括。
    【解决方案2】:

    #ifndef 表示宏根本没有在该文件中定义 在您包含的标头之前或中。在您的情况下,它默认为 0。

    如果您将该文件中的DEBUG_PRINTS 更改为1,它将覆盖头文件中#ifndef 中的#define。您基本上是在本地将导入的头文件中的默认DEBUG_PRINTS 定义或覆盖为1

    否则,宏仅对该文件或标题可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2016-06-21
      • 1970-01-01
      相关资源
      最近更新 更多