#define多个文件中的范围

Ken*_*eth 13 c scope c-preprocessor

我有一个像这样的主文件:

main_a.c:

#define MAIN_A

#include <stdio.h>
#include "shared.h"

extern int i;
int main() {
  printf("i is: %d\n", i);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想在shared.h中使用这样的定义:

shared.h

#if defined(MAIN_A)
# define A
#endif
Run Code Online (Sandbox Code Playgroud)

所以我可以根据主文件是否存在来声明变量,如下所示:

shared.c

#include "shared.h"

#if defined(A)
int i = 1;
#else
int i = 0;
#endif
Run Code Online (Sandbox Code Playgroud)

我使用makefile构建它,如下所示:

Makefile文件:

all : a
    ./a

a : main_a.o shared.o
    gcc -o $@ $^

%.o : %.c
    gcc -c $<
Run Code Online (Sandbox Code Playgroud)

然而这打印

i is: 0
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:为什么编译共享模块时定义似乎丢失了?我知道主模块是先编译的,所以定义应该在编译shared.c时解决.

我怀疑的是,预处理器可能会在每个模块构建开始时运行,而不仅仅是在项目开始时运行.如果这是正确的,有一种方法可以一次编译多个模块,以便在我上面尝试时使用预处理器吗?

Ada*_*man 12

在编译之前为每个文件运行预处理程序,即一次用于main_a.c,然后再单独用于shared.c.编译shared.c时MAIN_A未定义.

预处理器不能以您尝试的方式使用,即在编译单元之间记住状态.

您可以做的是MAIN_A使用-DMakefile中的编译器选项定义名称(例如),并使用预处理器以与现在相同的方式测试此名称.这种方式定义发生在项目级别(在Makefile中)而不是在编译单元级别(在.c文件中).