多个 #ifndef 语句 - 应用哪一个

Multiple #ifndef statements - which one gets applied

假设我有五个文件: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 关键字相同?

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

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

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

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