Copy from
C语言中#undef的语法是:
#undef 标识符
用来将前面定义的宏标识符取消定义。
整理了如下几种常见用法,如果以后发现其他的再添加进来。
1、在一个程序块中用完宏定义后,为防止后面标识符冲突需要取消其宏定义:
#include <stdio.h>
int main()
{
#define MAX 200
printf("MAX = %d
", MAX);
#undef MAX
{
int MAX = 10;
printf("MAX = %d
", MAX);
}
return 0;
}
/********程序1:main.c********/
2、在同一个头文件中定义结构类型相似的对象,根据宏定义不同获取不同的对象,主要用于增强代码的可读性:
例如:在头文件student.h中定义两个学生对象(小明和小红),两个对象互不干涉:
#ifdef MING
#define MING_AGE 20
#define MING_HEIGHT 175
#endif
#ifdef HONG
#define HONG_AGE 19
#define HONG_HEIGHT 165
#endif
/********头文件2:student.h********/
在源文件中使用这两个对象:
#include <stdio.h>
#define MING
#include "student.h"
#undef MING
#define HONG
#include "student.h"
#undef HONG
int main()
{
printf("Xiao Ming's age is %d.
", MING_AGE);
printf("Xiao Hong's age is %d.
", HONG_AGE);
return 0;
}
/********程序2:main.c********/
在一个头文件里定义的两个对象与分别在两个头文件里定义效果相同,但如果将相似的对象只用一个头文件申明,可以增强源代码的可读性。
3、将某个库函数包装成自定义接口,而只允许用户调用自定义接口,禁止直接调用库函数:
(此例来源于《C和指针》)
自定义安全的内存分配器接口:
/*
** 定义一个不易发生错误的内存分配器
*/
#include <stdlib.h>
#define malloc //防止直接调用malloc!
#define MALLOC(num, type) (type *)alloc((num) * sizeof(type))
extern void *alloc(size_t size);
/***********不易发生错误的内存分配器接口:alloc.h***********/
其中“#define malloc”是为了防止用户直接调用库函数malloc,只要包含了这个头文件alloc.h,就不能直接调用库函数malloc,而只能调用自定义函数MALLOC,如果用户要调用库函数malloc编译器会发生错误;
自定义安全的内存分配器实现:
/*
** 不易发生错误的内存分配器的实现
*/
#include <stdio.h>
#include "alloc.h"
#undef malloc
void *alloc(size_t size)
{
void *new_mem;
new_mem = malloc(size);
if(new_mem == NULL)
{
printf("Out of memory!
");
exit(1);
}
return new_mem;
}
/***********不易发生错误的内存分配器实现:alloc.c***********/
因为在实现中需要用到库函数malloc,所以需要用这一句“#undef malloc”取消alloc.h中对malloc的宏定义。
这种技巧还是比较有意思的,用于对已经存在的函数进行封装,感觉还是很有用哒。
4、用于调试头文件中,偶然看到这样一个代码用到了#undef,写于此作为记录:
#ifdef _DEBUG_
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
/***********调试代码头文件:debug.h***********/
————————————————
版权声明:本文为CSDN博主「Hugoool」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014170067/article/details/53561821