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

本文深入解析GCC编译器中宏定义的使用方法,包括-D预定义宏,-U取消宏定义,以及它们如何影响源代码中的宏定义。通过具体示例,展示了宏定义及其值在编译过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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)
Building target: slave.elf C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: ./src/hal_entry.o: in function `hal_entry': E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:16:(.text.hal_entry+0x4): undefined reference to `R_BSP_SystemInit' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:19:(.text.hal_entry+0x8): undefined reference to `R_BSP_TimeInit' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:25:(.text.hal_entry+0x1e): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:41:(.text.hal_entry+0x2a): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:35:(.text.hal_entry+0x42): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: ./src/nrf24_slave.o: in function `nrf24_slave_is_connected': E:\Ebedded\sur\slave\Debug/../src/nrf24_slave.c:158:(.text.nrf24_slave_is_connected+0x10): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/nrf24_slave.c:160:(.text.nrf24_slave_is_connected+0x24): undefined reference to `R_BSP_MillisecondsGet' collect2.exe: error: ld returned 1 exit status make: *** [makefile:96: slave.elf] Error 1
最新发布
07-18
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值