[c/c++] gcc makefile -D宏定义 -U取消宏定义

前言

Makefile中常见到-D,但这其实不是makefile所有的,而是gcc所有的。


-D

-D name
Predefine name as a macro, with definition 1.

定义宏,且将其值默认定义为1

  • 宏定义
gcc -D FOO
gcc -DFOO

可通过以上两种方式来宏定义FOO,即-D后加空格或不加空格都可以,这两种方式定义,FOO的值默认为1。

  • 宏定义+赋值
gcc -DFOO=2
gcc -D FOO=2

以上两种方式均可宏定义FOO且将其值定义为2。
注:FOO=2中间不能有空格


-U

 -U name
 Cancel any previous definition of name, 
 either built in or provided with a -D option.

取消宏定义,我现在的理解是取消在gcc编译时定义的某宏定义,即取消gcc命令中-U之前对应的-D,其不能取消源代码中定义的相应宏定义

gcc -U FOO
gcc -UFOO

可通过以上两种方式来取消宏定义FOO,即-U后加空格或不加空格都可以。


测试

  • 代码1
#include <stdio.h>

int main()
{
#ifdef FOO
	printf("foo defined, its value is %d\n", FOO);
#else
	printf("foo undefined\n");
#endif
	return 0;
}
  • 测试1.1

编译

gcc testD.c -D FOO

结果

foo defined, its value is 1

FOO的值默认设置为1

  • 测试1.2

编译

gcc testD.c -D FOO=2

结果

foo defined, its value is 2
  • 测试1.3

编译

gcc testD.c -D FOO=2 -U FOO

结果

foo undefined
  • 测试1.4

编译

$gcc testD.c -U FOO -D FOO=2

结果

foo defined, its value is 2

-U只能取消其之前对应的-D

  • 代码2
#include <stdio.h>

#define FOO 2		// !!!!!! 修改在这里

int main()
{

#ifdef FOO
  printf("foo defined, its value is %d\n", FOO);
#else
  printf("foo undefined\n");
#endif

  return 0;
}

  • 测试2.1

编译

$gcc testD.c

结果

foo defined, its value is 2
  • 测试2.2

编译

gcc testD.c -U FOO

结果

foo defined, its value is 2

可见-U不能取消代码中的宏定义


gcc版本

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值