这条指令用于移除一个宏定义。
#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;
}
报错与警告:
二、命令行定义
许多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 '未声明(首次在此函数中使用))