在多个文件中定义范围

前端之家收集整理的这篇文章主要介绍了在多个文件中定义范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个这样的主要文件

main_a.c:@H_502_3@

#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这样:@H_502_3@

shared.h@H_502_3@

#if defined(MAIN_A)
# define A
#endif

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

shared.c@H_502_3@

#include "shared.h"

#if defined(A)
int i = 1;
#else
int i = 0;
#endif

我使用一个看起来像这样的makefile来构建它:@H_502_3@

Makefile文件:@H_502_3@

all : a
    ./a

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

%.o : %.c
    gcc -c $<

但是这样打印@H_502_3@

i is: 0

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

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

解决方法

在编译前为每个文件运行预处理程序,即对于main_a.c一次,然后再次为shared.c独立运行.当shared.c被编译时,MAIN_A是未定义的.

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

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

猜你在找的C&C++相关文章