#undef的语法

定义:#undef 标识符,用来将前面定义的宏标识符取消定义。

整理了如下几种#undef的常见用法。

1. 防止宏定义冲突
在一个程序块中用完宏定义后,为防止后面标识符冲突需要取消其宏定义。

例如:

#include <stdio.h>

int main()
{
#define MAX 200
printf("MAX = %d\n", MAX);
#undef MAX int MAX = ;
printf("MAX = %d\n", MAX); return ;
}

在一个程序段中使用完宏定义后立即将其取消,防止在后面程序段中用到同样的名字而产生冲突。

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

在源文件中使用这两个对象:

#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 ;
}

在一个头文件里定义的两个对象与分别在两个头文件里定义效果相同,但如果将相似的对象只用一个头文件申明,可以增强源代码的可读性。

3. 自定义接口
将某个库函数包装成自定义接口,而只允许用户调用自定义接口,禁止直接调用库函数。

例如,自定义安全的内存分配器接口:

/*
** 定义一个不易发生错误的内存分配器
*/
#include <stdlib.h> #define malloc //防止直接调用malloc!
#define MALLOC(num, type) (type *)alloc((num) * sizeof(type))
extern void *alloc(size_t size);

其中“#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();
}
return new_mem;
}

因为在实现中需要用到库函数malloc,所以需要用这一句“#undef malloc”取消alloc.h中对malloc的宏定义。

这种技巧还是比较有意思的,用于对已经存在的库函数进行封装。而且如果包含了自定义接口文件,就不能直接调用库函数,而只能调用自定义封装的函数。

4. 用于调试头文件中
用于调试头文件中,偶然看到这样一个代码用到了#undef,写于此作为记录:

#ifdef _DEBUG_
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif

最新文章

  1. DZY Loves Sequences
  2. [leetcode]Find Minimum in Rotated Sorted Array II @ Python
  3. 牛客网上的剑指offer题目
  4. NSArray 迭代
  5. java_JdbcUtilis_单实例
  6. Android 常用UI控件之TabHost(3)在4.0不显示图标的解决方案
  7. 关于textarea标签在谷歌跟火狐可以拖动大小
  8. c链表结点的删除和添加
  9. BZOJ 1296: [SCOI2009]粉刷匠( dp )
  10. 举例说,在命令模式(Command Pattern)
  11. linux 在系统启动过程
  12. 使用cocapods报错 [!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes
  13. php添加pcntl扩展(Linux)
  14. python 安装cv2
  15. 【常见错误】--Nltk使用错误
  16. Linux -- 项目部署
  17. HDU 5977 Garden of Eden(点分治求点对路径颜色数为K)
  18. Spark_JGroupByKey
  19. web服务器和数据库服务器分离的优势
  20. solr 下载 有dist目录的(6需要8)

热门文章

  1. canal使用记录
  2. node实现防盗链
  3. 一个不错的intellj 相关的博客
  4. EL表达式---自定义函数(转)
  5. 程序员小张的第一篇博文 --记Markdown的使用学习
  6. 原创Pig0.16.0安装搭建
  7. [转载]利用分块传输绕过WAF进行SQL注入
  8. Spring5:面向切面
  9. windows 系统查看NVIDIA显卡GPU情况,nvidia-smi在windows上使用
  10. 面试题56 - I. 数组中数字出现的次数