C语言中#undef的语法定义是:#undef 标识符,用来将前面定义的宏标识符取消定义。

然而,在实际应用中,#undef到底可以用来做什么?

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

1. 防止宏定义冲突

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

例如:

#include <stdio.h>int main()
{
#define MAX 200
printf("MAX = %d\n", MAX);
#undef MAXint MAX = 10;printf("MAX = %d\n", 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 HONGint 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 ********/

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

3. 自定义接口

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

(此例来源于《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 mallocvoid *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的宏定义。

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

4. 用于调试头文件中

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

#ifdef _DEBUG_
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif/*********** 例程6:debug.h ***********/

C语言中#undef的常用法相关推荐

  1. C语言中#undef的用法

    C语言中#undef的语法定义是:#undef 标识符,用来将前面定义的宏标识符取消定义. 然而,在实际应用中,#undef到底可以用来做什么? 整理了如下几种#undef的常见用法. 1. 防止宏定 ...

  2. c语言中fputc函数的作用是,C语言中fputc函数的用法_后端开发

    Python画ROC曲线和AUC值计算(附代码)_后端开发 ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器的优劣.这篇文章将先简单的 ...

  3. c语言中 char怎样用,C语言中char*和char[]用法区别分析

    C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...

  4. C语言中atoi()函数的用法

    C语言中atoi()函数的用法 一.学习要点: 1.int atoi(const char *str)把参数str所指向的字符串转换为一个整数: 二.代码 #include<stdio.h> ...

  5. python语言中with as的用法使用详解

    本篇文章主要介绍了python语言中with as的用法使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 With语句是什么? 有一些任务,可能事先需要设置,事后做 ...

  6. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  7. C语言中,#include的用法:#include 和 #include区别

    C语言中,#include的用法:#include "" 和 #include<>区别 采用 " ":依次搜索当前目录.包括/I编译开关的路 ...

  8. C语言中fscanf()函数的用法介绍

    C语言中fscanf()函数的用法介绍 fscan()函数的原型: int fscanf(FILE *stream,const char *format,[argument...]); fscanf函 ...

  9. scanf在c语言中的作用,c语言中scanf的基本用法

    前言 scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单: 1 int a; 2 scanf("%d",&a); ...

最新文章

  1. Pandas常用技巧总结
  2. 使用git提交项目到码云
  3. haproxy配置代理tomcat和nginx_你真的掌握LVS、Nginx及HAProxy工作原理吗?
  4. MATLAB函数参数个数控制
  5. android 动态文本选取,android-用动态文本更新UI
  6. PAT 甲级 1003
  7. c语言程序下三子棋,C语言实现三子棋游戏(初级版)
  8. 网卡添加VLAN TAG
  9. raid0 trim linux,6系主板泪流满面,终于支持RAID 0模式下的TRIM了
  10. 如何快速通过信息系统管理工程师考试
  11. 拈一朵不悔的缘识之花,为你静候流年
  12. 去除input search框输入自带的叉号
  13. 怎么压缩图片的体积大小,4款软件分享
  14. 华为交换机导入配置_华为交换机通用配置方式方法
  15. 林业行业上的调查规划设计资质办理管理办法
  16. XML文件的一些操作
  17. 手机游戏开发培训: 手机游戏开发培训渐入成熟 、技术培训打造IT金领
  18. 图像DFT和DCT的频域真实频率
  19. 中国地区表SQL语句
  20. Process of CrawlingBlog

热门文章

  1. 经典消除游戏——Unity 祖玛游戏
  2. C基础 函数的形式参数和实际参数
  3. 理解Online Learning
  4. 常见的环幕投影的特点优势和构成
  5. IE6、IE7、IE8 CSS Bug兼容解决记录
  6. linux删除文件或文件夹
  7. [原]Blog 手记
  8. 2023年2月随笔-难产的“学系列”
  9. mysql rrdtool_RRDtool下载
  10. html 表格英语自动断字,怎么让表格中超长英文单词自动换行