从 Makefile 覆盖宏常量

Posted

技术标签:

【中文标题】从 Makefile 覆盖宏常量【英文标题】:Overwrite a macro constant from a Makefile 【发布时间】:2017-01-03 06:39:36 【问题描述】:

是否可以用 Makefile 中的另一个值覆盖宏?

假设我有一个文件a.c 和一个Makefile

a.c 文件中,我将宏声明为#define DEBUG 1。 我想将值从Makefile 替换为CCFLAGS += -D DEBUG -Dvar=1。但是,如果我这样做,我会收到 redefine 警告,并且该值将保持在 a.c 中使用的值。

这可能吗?还有,这是不好的做法吗?

【问题讨论】:

【参考方案1】:

您需要自己修改宏定义:

#ifndef DEBUG
#  define DEBUG 1
#endif

或者只是完全删除定义,并始终从构建系统传递值。

【讨论】:

【参考方案2】:

这可能吗?

不可能通过像-DFOO=bar 这样的标志,因为命令行中的宏定义在源代码文件中的之前,因此将被覆盖(重新定义)。

但是,如果您打算通过编译器标志控制宏值,您可能会发现 ifndef 指令很有帮助。例如:

[pengyu@GLaDOS-Precision-7510 tmp]$ cat a.c 
#ifndef TEST
#  define TEST 1
#endif

TEST
[pengyu@GLaDOS-Precision-7510 tmp]$ cpp a.c
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "a.c"




1
[pengyu@GLaDOS-Precision-7510 tmp]$ cpp a.c -DTEST=2
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "a.c"




2

【讨论】:

以上是关于从 Makefile 覆盖宏常量的主要内容,如果未能解决你的问题,请参考以下文章

如何在Makefile中定义宏进行条件编译

Makefile 是如何工作的?其中的宏定义分别是啥意思?

Makefile,宏修饰符

在 makefile 中为 Visual Studio C++ 构建定义宏

在 Watcom makefile 中扩展宏时 *$ 是啥意思?

Makefile中的宏定义必须采用 和 么