【C C++内功心法】剖析预处理过程,详解其他预处理指令

这条指令用于移除一个宏定义。

#undef NAME
//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除。

举例:

#include<stdlib.h> // malloc的头文件
#define MALLOC(num, type) (type*)malloc(num * sizeof(type))

int main()
{
	// 正常使用
	int* p1 = MALLOC(10, int); // 替换后为 int* p1 = (int*)malloc(10 * sizeof(int));

#undef MALLOC // 这条命令下面就用不了MALLOC这个宏了,如果继续用,编译器会报错

	char* p2 = MALLOC(5, int); // 这里就会报错:“MALLOC” 未定义

	return 0;
}

报错与警告:

a29fe082f1f449c98037ef502c8bc2e9.png


二、命令行定义

许多C的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。

提示:当前操作会在Linux环境下演示,vs下演示不出这个效果。

举例:

当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要一个数组能够大些。

#include <stdio.h>

int main()
{
	int array[SZ]; // 这里的SZ还没有定义
	int i = 0;

	for (i = 0; i < SZ; i++)
	{
		array[i] = i;
	}

	for (i = 0; i < SZ; i++)
	{
		printf("%d ", array[i]);
	}

	printf("\n");

	return 0;
}
  • 直接用gcc编译上面的代码:

这里gcc就会报错:‘SZ’ undeclared (first use in this function)(’ SZ '未声明(首次在此函数中使用))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值