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;#elseint i = 0;#endif
我使用一个看起来像这样的makefile来构建它:
Makefile文件:
all : a ./aa : main_a.o shared.o gcc -o $@ $^%.o : %.c gcc -c $<
但是这样打印
i is: 0
现在我的问题是:为什么在编译共享模块时,这个定义似乎丢失了?我知道主模块是先编译的,所以定义应该已经在shared.c被编译的时候解决了.
有一个怀疑是,预处理器可能在每个模块构建的开始运行,而不仅仅是在项目的开始.如果这是正确的,那么有一种方法可以一次编译多个单个模块,以便在上面尝试使用预处理器?
解决方法 在编译前为每个文件运行预处理程序,即对于main_a.c一次,然后再次为shared.c独立运行.当shared.c被编译时,MAIN_A是未定义的.预处理器无法以您尝试的方式使用,即在编译单元之间记住状态.
您可以做的是使用Makefile中的-Dcompiler选项定义一个名称(例如MAIN_A),并使用预处理器以与现在所做的相同的方式测试此名称.这样,定义就发生在项目级别(在Makefile中),而不是在编译单元级(在.c文件中).
总结以上是内存溢出为你收集整理的在多个文件中定义范围全部内容,希望文章能够帮你解决在多个文件中定义范围所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)