加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在多个文件中定义范围

发布时间: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文件中).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读