我有一个这样的主要文件:
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; }
我想在shared.h中使用define这样:
shared.h
#if defined(MAIN_A) # define A #endif
所以我可以根据主文件是否存在来声明一个变量,如下所示:
shared.c
#include "shared.h" #if defined(A) int i = 1; #else int i = 0; #endif
我使用一个看起来像这样的makefile来构建它:
Makefile文件:
all : a ./a a : main_a.o shared.o gcc -o $@ $^ %.o : %.c gcc -c $<
但是这样打印
i is: 0
现在我的问题是:为什么在编译共享模块时,这个定义似乎丢失了?我知道主模块是先编译的,所以定义应该已经在shared.c被编译的时候解决了.
有一个怀疑是,预处理器可能在每个模块构建的开始运行,而不仅仅是在项目的开始.如果这是正确的,那么有一种方法可以一次编译多个单个模块,以便在上面尝试使用预处理器?