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
使用-D
Makefile中的编译器选项定义名称(例如),并使用预处理器以与现在相同的方式测试此名称.这种方式定义发生在项目级别(在Makefile中)而不是在编译单元级别(在.c文件中).