C语言中#undef的用法
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的用法相关推荐
- C语言中#undef的常用法
C语言中#undef的语法定义是:#undef 标识符,用来将前面定义的宏标识符取消定义. 然而,在实际应用中,#undef到底可以用来做什么? 整理了如下几种#undef的常见用法. 1. 防止宏定 ...
- c语言中getche的用法,c语言中getch的用法
[www.hywsbj.com--图表展板] getch()函数是无回显的从控制台取得一个字符.以利用getch()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面,即任意键继续效果.下面小编 ...
- php indexof的用法,c语言中indexof的用法有哪些
c语言中indexof的用法有哪些 index在互联网上表示网站的默认主页.一般为 index.html index.htmindex.aspindex.php:另外的默认主页也多用default.h ...
- c语言中point的用法_关于C语言Switch语句,先学这些技巧够不够?
一.C语言中switch的用法 1.switch后面括弧内的[表达式],ANSI标准允许它为任何类型: 2.当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,否则,就 ...
- c语言中size of 用法,C语言中sizeof()的用法
要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在 ...
- C语言中const的用法
C语言中const的用法 基本解释 const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解co ...
- sql 语言中 when case 用法
sql语言中有没有相似C语言中的switch case的语句?? 没有,用case when 来取代就行了. 比如,以下的语句显示中文年月 select getdate() as 日期,case mo ...
- c语言中switch的用法是什么?
c语言中switch的用法是: 功能:switch语句是多分支选择语句.用来实现多分支选择结构.if语句只有两个分支可供选择,而实际问题中常常要用到多分支的选择.例如,学生成绩分类(90为" ...
- #define c# 报错_c语言中#define的用法
c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...
最新文章
- 如何快速的给你的项目添加icon图标
- 王恩东院士:AI计算是未来的核心生产力
- C#中equal与==的区别
- boost::is_straight_line_drawing用法的测试程序
- vue知识点归纳与总结(笔记)
- 被单位开除、摆地摊、住酒店带脸盆被褥,还你一个真实的陈景润
- 和我一起开发Android应用(二)——“悦词-i背单词”项目功能分析
- IIS6.0下ASP的新增功能
- 【报告分享】食品饮料行业供应链发展与渠道变革趋势.pdf(附下载链接)
- 如何将索引碎片数量降至最低
- 如何下载spring源码?
- 开源 免费使用 打包下载 自行部署 :升讯威 周报系统 2.0 最新版
- 超好用的数学教学软件:几何画板Sketchpad for Mac中文版
- Filecoin网络为什么需要矿池,ipfs\FIL挖矿比单体矿机有什么优势
- 计算机任务管理器无法响应,电脑任务管理器经常未响应怎么办
- 帝国cms php调用模板变量,帝国cms列表封面模板和内容模板变量的讲解
- MFC 调用系统ping工具检测网络
- 我是如何一步一步搞定小区的安防系统
- bcdedit无法打开启动配置数据存储
- win10系统更新后,开机蓝屏解决方案
热门文章
- maven中设置不引入子依赖(使用exclusion)
- 什么才是一个好的团队?
- 中国侨联“2019华侨华人春节大联欢”晚会在京录制
- 校园商铺平台1.0学习
- JAVA判断当前时间是否为节假日、周末、工作日,简单有效!
- gojs 官网api翻译
- 2021年化工自动化控制仪表免费试题及化工自动化控制仪表复审模拟考试
- cpu和内存的关系(CPU,内存和cache之间的关系)
- dcam matlab,matlab – 如何更改相机参数(自动曝光,快门速度,增益)?
- 北京开放大学非凡十年,谱写首都开放教育新篇章