3.3.5   取消宏定义和重新定义宏

#undef命令可以取消定义一个名称为宏:#undef name

这个命令使预处理器忘记name的所有宏定义。取消一个当前未定义宏的定义并不是错误。当一个名称被取消定义之后,就可以向它提供一个全新的定义(使用#define),而不会产生任何错误。在#undef命令内部,并不会执行宏替换。

标准C以及其他许多编译器允许对宏进行温和的重定义。也就是说,新定义与原来的定义必须逐标记相同。新定义所包含的空白字符的位置必须与原定义相同,尽管具体的空白字符可以不同。我们认为程序员不应该依赖这种温和的重定义。更好的风格是让所有的程序入口都使用同一个单独的定义点,包括宏(有些旧式的C编译器可能不允许任何类型的重定义)。

例子

在下面的定义中,NULL的重定义是允许的,但对FUNC的所有重定义都是非法的(第1个重定义包含了原定义中未曾出现的空格,第2个重定义修改了两个标记)。

例子

当程序员由于法律的原因无法知道是否存在以前的定义时,可以使用#ifndef命令测试是否存在一个现有的定义,以避免对它进行重定义:

在那些允许命令中的宏定义调用C编译器的实现中,这种用法特别有用。例如,下面这个UNIX对C的调用提供了5000作为MAXTABLESIZE宏的初始定义。随后,C程序员应该像前面一样检查这个定义:

尽管标准C并不允许,但一些旧式的预处理器实现在处理#define和#undef时就像维护一个定义堆栈一样。当一个名称用#define进行重新定义时,它的旧定义被压入到堆栈中,然后用新定义替换这个旧定义。当一个名称用#undef取消定义时,当前的定义就被丢弃,最近的一个定义(如果有)就被恢复。

参考:#define命令 第3.3节;#ifdef和ifndef命令 第3.5.3节。

【责任编辑:云霞 TEL:(010)68476606】

点赞 0

c语言解除宏定义_3.3.5 取消宏定义和重新定义宏相关推荐

  1. c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...

    1.C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义呢? 在学习U-boot的过程中遇到这么一个定义: # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MO ...

  2. 定义变量和常量的规范 c语言,C语言编程规范教材及练习(标识符命名与定义 变量 宏、常量 表的达式).pptx...

    C语言编程规范教材及练习(标识符命名与定义 变量 宏.常量 表的达式) C语言编程规范教材C语言编程规范工作组 201104目录标识符命名与定义 变量宏.常量表达式标识符的命名要清晰原则3.1 标识符 ...

  3. C语言拯救者(程序的预处理、编译、链接与宏- -15)

    注:由于VS2019是集成开发环境,不方便观察细节.我们使用Linxu gcc来演示编译和链接 目录 1. 程序的翻译环境和执行环境 2. 编译和链接 2. 编译的几个阶段 2.1 预编译(预处理): ...

  4. c语言一维数组字符串数组初始化,一维数组的定义、初始化和引用

    一维数组的定义.初始化和引用 一维数组的定义.初始化和引用 1.一维数组的定义方式为: 类型说明符 数组名[常量表达式] (1)数组名的命名方法与变量名相同,遵循标识符命名规则; (2)数组是用方括号 ...

  5. c语言不允许对数组的大小做动态定义,数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt...

    <数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt>由会员分享,可在线阅读,更多相关<数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt(32页珍藏版)> ...

  6. Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D

    在源代码里面如果这样是定义的: #ifdef   MACRONAME //可选代码 #endif 那在makefile里面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   ...

  7. Java语言用于定义接口的关键字是_定义类的保留字是(__)定义接口的保留字是(__);...

    [单选题]为了使包sos在当前程序中可见,可以使用的语句是( ) [单选题]方法的作用不包含:( ) [判断题]水平方向布置的三相平行导体在发生三相短路时 , 最大电动力出现在 A 相. ( ) [单 ...

  8. 三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。 定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,在程序中用带

    题目描述 三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a.b.c为三角形的三边. 定义两个带参的宏,一个用来求area, 另一个宏用来求S. 写程序,在 ...

  9. C语言结构体学生基本资料,用结构体定义10个学生基本信息

    用结构体定义10个学生基本信息,用到结构体.子函数.文件等的相关知识. /* ************************************************* 2.1.用结构体定义1 ...

最新文章

  1. JQuery选择器大全
  2. MongoDB导出csv格式数据
  3. 深度软件商店_3D深度相机,这就是微软未来手机Surface Duo新特性
  4. 鹤峰:美丽的茶乡—— 山水篇
  5. S3C6410启动模式介绍
  6. 诗与远方:无题(三)
  7. uri uri_什么是URI? 了解许可证术语以确保合规
  8. 通过XShell实现windows文件上传到Linux服务器上
  9. C#动态调用WCF接口,两种方式任你选。
  10. 求最长XX序列的两种方法
  11. ISO 12233分辨率测试卡是否已经淘汰了?
  12. python函数之任意数量的实参
  13. itext 导出pdf 图片太大
  14. ThinkPad安装ALPS驱动后任然关闭触摸板失败的解决方法
  15. pale moon 最新版中文包安装方法
  16. linux运行魔兽世界,暴雪内部就这么玩:Linux运行《魔兽世界》教程
  17. Android中补间动画相关知识
  18. mac数字键盘错乱_电脑键盘输入字母数字错乱怎么回事
  19. CTF信息搜集/泄露
  20. 【01.14】网络安全学习day3

热门文章

  1. tf.matmul()
  2. 使用Word制作文档封面
  3. 电脑常用快捷键与指示灯
  4. 我收集的PDF电子书
  5. 淘宝知网查重怎么样?
  6. ida 动态调试so库 (连接夜神模拟器)
  7. AutoJs+mitmproxy App爬虫
  8. css实现视频文字特效
  9. 华为荣耀所有系列手机,如何安装谷歌应用框架?
  10. 我国计算机把计算机分为巨型,把计算机分为巨型机大中型机按照什么分的