C语言 #undef的用法

article/2025/8/30 6:39:54

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

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

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

1. 防止宏定义冲突

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

例如:

 
  1. #include <stdio.h>

  2.  

  3. int main()

  4. {

  5. #define MAX 200

  6. printf("MAX = %d\n", MAX);

  7. #undef MAX

  8.  

  9.     int MAX = 10;

  10.     printf("MAX = %d\n", MAX);

  11.  

  12.     return 0;

  13. }

  14.  

  15. /******** 例程1:main.c ********/

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


2. 增强代码可读性

在同一个头文件中定义结构类型相似的对象,根据宏定义不同获取不同的对象,主要用于增强代码的可读性。

例如:在头文件student.h中定义两个学生对象(小明和小红),两个对象互不干涉。

 
  1. #ifdef MING

  2. #define MING_AGE 20

  3. #define MING_HEIGHT 175

  4. #endif

  5.  

  6. #ifdef HONG

  7. #define HONG_AGE 19

  8. #define HONG_HEIGHT 165

  9. #endif

  10.  

  11. /******** 例程2:student.h ********/


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

 
  1. #include <stdio.h>

  2.  

  3. #define MING

  4. #include "student.h"

  5. #undef MING

  6. #define HONG

  7. #include "student.h"

  8. #undef HONG

  9.  

  10. int main()

  11. {

  12. printf("Xiao Ming's age is %d.\n", MING_AGE);

  13. printf("Xiao Hong's age is %d.\n", HONG_AGE);

  14.  

  15. return 0;

  16. }

  17.  

  18. /******** 例程3:main.c ********/

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

3. 自定义接口

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

(此例来源于《C和指针》)

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

 
  1. /*

  2. ** 定义一个不易发生错误的内存分配器

  3. */

  4. #include <stdlib.h>

  5.  

  6. #define malloc                         //防止直接调用malloc!

  7. #define MALLOC(num, type)   (type *)alloc((num) * sizeof(type))

  8. extern void *alloc(size_t size);

  9.  

  10. /*********** 例程4:alloc.h ***********/

其中“#define malloc”是为了防止用户直接调用库函数malloc,只要包含了这个头文件alloc.h,就不能直接调用库函数malloc,而只能调用自定义函数MALLOC,如果用户要调用库函数malloc编译器会发生错误。

自定义安全的内存分配器的实现:

 
  1. /*

  2. ** 不易发生错误的内存分配器的实现

  3. */

  4. #include <stdio.h>

  5. #include "alloc.h"

  6. #undef malloc

  7.  

  8. void *alloc(size_t size)

  9. {

  10.     void *new_mem;

  11.     new_mem = malloc(size);

  12.     if(new_mem == NULL)

  13.     {

  14.         printf("Out of memory!\n");

  15.         exit(1);

  16.     }

  17.     return new_mem;

  18. }

  19.  

  20. /*********** 例程5:alloc.c ***********/

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

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

4. 用于调试头文件中

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

 
  1. #ifdef _DEBUG_

  2. #undef THIS_FILE

  3. static char THIS_FILE[] = __FILE__;

  4. #define new DEBUG_NEW

  5. #endif

  6.  

  7. /*********** 例程6:debug.h ***********/


 

 


http://chatgpt.dhexx.cn/article/f7PekvPr.shtml

相关文章

Perl学习-undef值和defined函数

undef值 undef是未定义的意思&#xff0c;在Perl中&#xff0c;会假设undef的变量时0或者空字符串 如果当成数字&#xff0c;就是0如果当成字符串&#xff0c;就是空字符串 当成数字 1 $n 1;2 3 while($n < 10){4 $sum $n;5 $n 2;6 }7 8 print "The tota…

吊打迅雷,最好用的BT种子下载器,下载不限速

今天小七要给大家带来的是一款安卓端BT下载器&#xff0c;用它来找片&#xff0c;下片&#xff0c;简直爽到极点&#xff0c;目前完全免费&#xff0c;无广告、无会员限制、极速下载、运行稳定支持多种格子解析、支持边下边播等等&#xff0c;拥有迅雷的所有功能&#xff0c;同…

比迅雷好用,下载速度快5倍的下载软件IDM(Internet Download Manager)

家好&#xff0c;很高兴大家阅读本文章&#xff0c;我一直在做自媒体&#xff0c;而且自媒体现在也当自己的一份工作来做了&#xff0c;那么在做自媒体的过程&#xff0c;肯定也会需要找素材&#xff0c;而在找素材的过程中需要用到下载工具&#xff0c;大家说说看现在国内&…

视频下载神器,支持 80+ 网站,比迅雷还快!

点击上方“逆锋起笔”&#xff0c;公众号回复 编程资源 领取大佬们推荐的学习资料开源最前线(ID:OpenSourceTop)编译 项目地址&#xff1a;https://github.com/soimort/you-get 今天&#xff0c;推荐一款下载神器&#xff0c;秒杀市面上你知道的所有下载工具&#xff0c;它就是…

迅雷自带的影音如何删除

1、首先下载迅雷影音&#xff1a; 2、下载之后&#xff0c;找到安装包&#xff0c;右键以压缩工具打开&#xff1a;并找到里面的XmpUninstall.exe文件---复制。 3、 复制到迅雷的安装路径下的这个路径&#xff1a;D:\Thunder Network\Thunder\Program\XMP\Program\XLGame&#…

群晖 NAS DSM 系统,只要三步使用 Docker 安装迅雷远程下载

前段时间群晖和迅雷的合作宣告终止&#xff0c;套件中移除了迅雷&#xff0c;但是说实话 DSM 自带的Download Station 实在是太慢了&#xff0c; 但是只要是 NAS是64位的处理器都可以使用 docker 套件&#xff08;好奇的同学可以了解一下 docker 的强大&#xff09;。 所以…

提高你的迅雷速度,绝对值得一看

QUOTE: 很多朋友都喜欢看电影,玩游戏.有个好的下载工具是必要的..迅雷 ,网快,bT,影音传送带 相信大家大多都使用,这四种.而相信大多数人都会使用迅雷,那是因为迅雷的速度比其它软件快的最主要的原因&#xff0c;是因为它可以通过查询候选资源来实现从多个服务器同时下载。而且…

两款清爽全能的下载神器,还不跟迅雷说拜拜?

前言 下载工具一直以来都是刚需&#xff0c;无奈近些年迅雷变得不好用后&#xff0c;广告、限速、限资源等等&#xff0c;能完美替代迅雷的免费给力的下载工具确实不好找。HTTP 类型的链接还好说&#xff0c;而种子和磁力链接这些依赖于大家做种分享的资源&#xff0c;没有迅雷…

迅雷想翻身,但区块链是好选择吗?

沉寂已久的迅雷&#xff0c;如今又有了新动作。 2月16日&#xff0c;迅雷集团旗下迅雷链推出的企业数字藏品服务平台正式上线。据悉&#xff0c;迅雷链企业数字藏品服务平台是基于迅雷链底层技术打造的&#xff0c;为企业和机构提供可信存证技术和数字藏品凭证的区块链云服务平…

linux下迅雷的替代

想用迅雷下载电影资源 经历了前几次调教之后&#xff0c;老糖的小笔电越来越好用&#xff0c;不过人的欲望始终是没有穷尽的。本来一开始直说把这个装了linux的老爷机用来看看在线视频&#xff0c;更更文就可以了&#xff0c;结果用着用着问题就又来了&#xff1a;好多老电影已…

迅雷和BT有什么区别?迅雷是不是不毁硬盘?速度快吗?

2007-10-10 14:00:16 迅雷是基于P2SP技术的下载软件&#xff0c;bt使用的是P2P技术&#xff0c;相信您应该有所了解。然而P2SP技术和P2P技术还是有差别的。 什么是P2SP技术&#xff1f; ------------------------------------------------- P2SP出现使用户有了更好的选择&…

封杀迅雷办法

带宽以及网络速度是最让企业网络管理员头疼的问题了&#xff0c;就目前中小企业来说P2P类软件是带宽的杀手&#xff0c;相比各位企业网络管理员都或多或少领教过BT或电驴等P2P软件对于网络带宽的“霸占”&#xff0c;当然除了这些传统下载工具外迅雷可以说是集众多P2P软件的“大…

推荐两款ios端磁力下载工具

说到磁力下载工具&#xff0c;大家第一个想到的就是迅雷对不对&#xff0c;然后又会想到一些莫名的画面&#xff0c;那除了迅雷&#xff0c;还有哪些磁力下载工具支持ios呢&#xff1f;今天我介绍两款款磁力下载工具给大家。 首先&#xff0c;对于安卓用户&#xff0c;大家可以…

想不到吧,迅雷悄悄在国外搞了个无限制的免费离线下载网盘!

有在用115的粉丝估计最近都在担心115是不是要凉了&#xff1f; 其实从去年5月份卖11.5年会员开始&#xff0c;就已经有很多人怀疑115是不是要最后卷一波钱跑路 &#xff08;只是很多人以为这次还是和之前的每次活动一样&#xff1a;都以为会跑路结果没跑路&#xff0c;所以还是…

IDM下载器和迅雷,二者谁更胜一筹?

电脑如今已经是每个人必备的了&#xff0c;不管是工作还是生活&#xff0c;都已经离不开了。下载软件算是不可或缺的一种工具&#xff0c;或者称为“装机必备软件”&#xff0c;的确&#xff0c;传统的文件下载方式太不方便了&#xff0c;下载时间长&#xff0c;下载状态也极度…

迅雷太难用了,可以换其他的下载软件

作者&#xff1a;砺心 链接&#xff1a;https://www.zhihu.com/question/19820075/answer/702495158 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 前几天介绍了许多&#xff1a;BT种子、磁力、ED2K链接搜索工具合…

迅雷替代品开源了!

今天&#xff0c;老逛推荐一款可边下边播磁力链接下载器&#xff1a;WebTorrent&#xff0c;该开源项目是第一个运行在浏览器的 Torrent 客户端&#xff0c;截止目前在 GitHub 上已经获得近 25k 的 Star。 该项目完全是用 JavaScript 编写的&#xff0c;并使用 WebRTC 实现了真…

linux 类似迅雷下载软件,推荐几个可以替代迅雷的下载软件

迅雷是我们耳熟能详的一个下载工具&#xff0c;随着下载限速内容审核等等一系列问题&#xff0c;使用迅雷的用户越来越少。 今天给大家推荐5款下载工具&#xff0c;它们可以不同程度的代替迅雷&#xff0c;让你免除限速的烦恼 第一款&#xff0c;也是比较有名的一款IDM&#xf…

三个可替代“迅雷”的下载软件,速度超快!

今天推荐可以替代迅雷的软件 那些你使用迅雷无法下载的资源 现在都可以下载了哦~ 1.qBittorrent 解压提供的安装包 然后双击 qbittorrent.exe 找到你要下载的磁力链接 点击右上角“添加下载任务” 设置你的下载路径 点击“OK”就可以开始下载啦&#xff01; 2.Torrent …

IDM和迅雷哪个更好用?Internet Download Manager迅雷对比

我们在日常生活中&#xff0c;常常会在网络上下载各种文件或资源&#xff0c;那这就需要用到相应的下载工具了。那市面上如此多的下载软件&#xff0c;我们该选择哪一款呢&#xff1f;今天&#xff0c;我就带来了市面上常见的两款下载工具——IDM和迅雷&#xff0c;对比一下&am…