C/C++宏替换实现详解

 更新时间:2020年11月19日 11:35:55   作者:fater  
这篇文章主要介绍了C/C++宏替换实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

基本形式

#define name replacement_text

通常情况下,#define 指令占一行,替换文本是 define 指令行尾部的所有剩余部分,但也可以把一个较长的宏定义分成若干行,这时需要在待续的行末尾加上一个反斜杠符 ``。

宏定义也可以带参数,这样可以对不同的宏调用使用不同的替换文本。例:

#define max(A, B) ((A) > (B) ? (A) : (B))

宏展开中的陷阱

仔细考虑一下 max 的展开式,其中的表达式会被计算两次,因此如果表达式中包含自增运算符或输入/输出等行为,则会出现不正确的情况,例如上述的宏 max:

max(i++, j++) // wrong

另外还需要注意,适当使用圆括号以保证计算次序的正确性,例如:

#define square(x) x * x // wrong

当用 square(z+1) 调用该宏定义时会出错。

#undef

在头文件 <stdio.h> 中,getchar 与 putchar 函数在实际中常常被定义为宏,这样可以避免处理字符时调用函数所需的运行时开销。<ctype.h> 头文件中定义的函数也常常是通过宏实现的。

可以通过 #define 取消名字的宏定义,这样做可以保证后续的调用是函数调用,而不是宏调用:

#undef getchar

int getchar(void) { ... } 

宏参数、# 和 ##

如果在宏定义的替换文本中,参数名以 # 作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串。例如,可以将它与字符串连接运算结合起来编写一个调试打印宏:

#define dprint(expr) printf(#expr " = %gn", expr)

使用语句

dprint(x/y);

调用该宏时,该宏将被扩展为:

printf("x/y" " = %gn", x/y);

其中的字符串被拼接起来了,这样,该宏调用的效果等价于

printf("x/y = %gn", x/y);

预处理器运算符 ## 为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与 ## 相邻,则该参数将被实际参数替代,## 与前后的空白符将被删除,并对替换后的结果重新扫描。例如,下面定义的宏 paste 用于连接两个参数:

#define paste(front, back) front ## back

因此,宏调用 paste(name, 1) 的结果将建立记号 name1。

参考文献:

Brian W. Kernighan, Dennis M. Ritchie.The C Programming Language (Second Edition)[M].机械工业出版社:北京,2004:76-77.

到此这篇关于C/C++宏替换实现详解的文章就介绍到这了,更多相关C/C++宏替换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ lambda闭包消除类成员变量的解决思路

    C++ lambda闭包消除类成员变量的解决思路

    在面向对象编程中,类成员变量过多可能会造成干扰,可以采用函数式编程的思想,通过闭包和lambda表达式减少不必要的类成员,增强代码的可控性和减少干扰,注意要正确使用mutable修饰符和值捕获,以及合理安排lambda的初始化时机,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • C语言之没有main函数的helloworld示例

    C语言之没有main函数的helloworld示例

    这篇文章主要介绍了C语言之没有main函数的helloworld示例,本文分解了带main函数的helloworld示例,从而分析出不需要main函数的helloworld示例,需要的朋友可以参考下
    2015-03-03
  • C++中LibCurl库的使用教程分享

    C++中LibCurl库的使用教程分享

    LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,这篇文章主要为大家介绍了如何在C++中使用LibCurl库,需要的可以参考下
    2023-08-08
  • C语言实现投票系统

    C语言实现投票系统

    这篇文章主要为大家详细介绍了C语言实现投票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Visual Studio Code配置C、C++环境并编写运行的方法

    Visual Studio Code配置C、C++环境并编写运行的方法

    这篇文章主要介绍了Visual Studio Code配置C、C++环境并编写运行的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 用C语言实现排雷游戏

    用C语言实现排雷游戏

    大家好,本篇文章主要讲的是用C语言实现排雷游戏,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C语言学生学籍管理系统课程设计

    C语言学生学籍管理系统课程设计

    这篇文章主要介绍了C语言学生学籍管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • c++使用Easyx图形库实现飞机大战

    c++使用Easyx图形库实现飞机大战

    本文详细讲解了c++使用Easyx图形库实现飞机大战,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C++实现AVL树的基本操作指南

    C++实现AVL树的基本操作指南

    AVL树是高度平衡的而二叉树,它的特点是AVL树中任何节点的两个子树的高度最大差别为1,下面这篇文章主要给大家介绍了关于C++实现AVL树的相关资料,需要的朋友可以参考下
    2022-01-01
  • C++实现中缀表达式转化为后缀表达式详解

    C++实现中缀表达式转化为后缀表达式详解

    这篇文章主要为大家详细介绍了如何利用C++解决实现中缀表达式转换为后缀表达式的问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论