前言
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后加空格或不加空格都可以。
测试
#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
#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)