目录
1、调试头文件
2、防止宏定义冲突
3、增强代码可读性
4、自定义接口
#undef 标识符是C语言中的一个重要的标识符,它的作用是用来将前面定义的宏标识符取消定义。
它常用在以下情况:
1、调试头文件
#ifdef _DEBUG_ #undef THIS_FILE static char THIS_FILE[] = __FILE__; #define new DEBUG_NEW #endif /* 例程6:debug.h */
讯享网
2、防止宏定义冲突
在一个程序块中用完宏定义后,为防止后面标识符冲突需要取消其宏定义。
讯享网#include <stdio.h> int main() { #define MAX 200 printf("MAX = %d\n", MAX); #undef MAX int MAX = 10; printf("MAX = %d\n", MAX); return 0; } / 例程1:main.c /
在一个程序段中使用完宏定义后立即将其取消,防止在后面程序段中用到同样的名字而产生冲突。
3、增强代码可读性
在同一个头文件中定义结构类型相似的对象,根据宏定义不同获取不同的对象,主要用于增强代码的可读性。
例如:在头文件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.\n", MING_AGE); printf("Xiao Hong's age is %d.\n", HONG_AGE); return 0; } / 例程3:main.c /
在一个头文件里定义的两个对象与分别在两个头文件里定义效果相同,但如果将相似的对象只用一个头文件申明,可以增强源代码的可读性。
4、自定义接口
将某个库函数包装成自定义接口,而只允许用户调用自定义接口,禁止直接调用库函数。
(此例来源于《C和指针》)
例如,自定义安全的内存分配器接口:
/* 定义一个不易发生错误的内存分配器 */ #include <stdlib.h> #define malloc //防止直接调用malloc! #define MALLOC(num, type) (type *)alloc((num) * sizeof(type)) extern void *alloc(size_t size); /* 例程4: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!\n"); exit(1); } return new_mem; } /* 例程5:alloc.c */
因为在实现中需要用到库函数malloc,所以需要用这一句“#undef malloc”取消alloc.h中对malloc的宏定义。
这种技巧还是比较有意思的,用于对已经存在的库函数进行封装。而且如果包含了自定义接口文件,就不能直接调用库函数,而只能调用自定义封装的函数。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/25831.html