在多个文件中定义范围
发布时间:2020-12-16 05:44:00 所属栏目:百科 来源:网络整理
导读:我有一个这样的主要文件: main_a.c: #define MAIN_A#include stdio.h#include "shared.h"extern int i;int main() { printf("i is: %dn",i); return 0;} 我想在shared.h中使用define这样: shared.h #if defined(MAIN_A)# define A#endif 所以我可以根据
我有一个这样的主要文件:
main_a.c: #define MAIN_A #include <stdio.h> #include "shared.h" extern int i; int main() { printf("i is: %dn",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被编译的时候解决了. 有一个怀疑是,预处理器可能在每个模块构建的开始运行,而不仅仅是在项目的开始.如果这是正确的,那么有一种方法可以一次编译多个单个模块,以便在上面尝试使用预处理器? 解决方法
在编译前为每个文件运行预处理程序,即对于main_a.c一次,然后再次为shared.c独立运行.当shared.c被编译时,MAIN_A是未定义的.
预处理器无法以您尝试的方式使用,即在编译单元之间记住状态. 您可以做的是使用Makefile中的-Dcompiler选项定义一个名称(例如MAIN_A),并使用预处理器以与现在所做的相同的方式测试此名称.这样,定义就发生在项目级别(在Makefile中),而不是在编译单元级(在.c文件中). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |