当前位置:   article > 正文

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

makefile -d

前言

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


-D

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

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

  • 宏定义
gcc -D FOO
gcc -DFOO
  • 1
  • 2

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

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

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


-U

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

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

gcc -U FOO
gcc -UFOO
  • 1
  • 2

可通过以上两种方式来取消宏定义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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
'
运行
  • 测试1.1

编译

gcc testD.c -D FOO
  • 1

结果

foo defined, its value is 1
  • 1

FOO的值默认设置为1

  • 测试1.2

编译

gcc testD.c -D FOO=2
  • 1

结果

foo defined, its value is 2
  • 1
  • 测试1.3

编译

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

结果

foo undefined
  • 1
  • 测试1.4

编译

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

结果

foo defined, its value is 2
  • 1

-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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
'
运行
  • 测试2.1

编译

$gcc testD.c
  • 1

结果

foo defined, its value is 2
  • 1
  • 测试2.2

编译

gcc testD.c -U FOO
  • 1

结果

foo defined, its value is 2
  • 1

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


gcc版本

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/965558
推荐阅读
相关标签
  

闽ICP备14008679号