C语言宏定义中的#和##是什么


这篇文章主要讲解了“C语言宏定义中的#和##是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言宏定义中的#和##是什么”吧!记号串化可以将函数式宏定义中的实参转换为字符串。在函数式宏定义中,如果替换列表中有“#”,则其后的预处理记号必须是当前宏的形参。在预处理期间,“#”连同它后面的形参一起被实参取代。例如程序运行结果如下:第1次调用宏时,用”y”替换#x。第2次调用宏时,用”2 + 4″替换#x。第3次调用宏时,用”3 * 2″替换#x。ANSI C字符串的串联特性将这些字符串与printf()语句的其他字符串组合,生成最终的字符串。例如,第1次调用变成:printf(“The square of ” “y” ” is %d.n”,((y)*(y)));然后,字符串串联功能将这3个相邻的字符串组合成一个字符串:”The square of y is %d.n”如果传入的实参中间有空白,则不管有多少,都被转换为一个空格,参数开头和末尾的空白都被删除。例如第3次调用宏时,实参“3 * 2 ”转换为“3*2”。与#运算符类似,##运算符可用于函数式宏的替换部分,它把两个记号组合成一个记号。例如,可以这样定义函数式宏:#define XNAME(n) x ## n然后,展开宏XNAME(4)为x4。记号黏结的作用是将几个预处理记号合并为一个。在一个函数式宏定义中,如果一个预处理记号的前面或者后面有”##”,则该记号将与它前面或者后面的记号合并,如果该预处理记号是宏的形参,则用实参执行合并。例如:第2行的宏调用,其扩展之后如下:charabr;需要注意的是,在函数式宏定义中,“##”不能位于替换列表的开头和结尾。程序运行结果如下。析:宏展开顺序大致可以归结为:第一步:首先用实参代替形参,将实免费云主机域名参代入宏文本中第二步:如果实参也是宏,则展开实参第三步:最后继续处理宏替换后的宏文本,如果仍包含宏,则继续展开注意:如果在第二步,实参代入宏文本后,实参之前或之后遇到#或##,实参不再展开根据以上宏展开步骤分析第8行的宏调用h(f(1,2)),其展开步骤为:h(f(1,2))–>g(f(1,2))–>g(1##2)–>g(12)–>”12″第9行的宏调用g(f(1,2)),其展开步骤为:g(f(1,2))–>#f(1,2)–>”f(1,2)”上面程序运行结果如下。感谢各位的阅读,以上就是“C语言宏定义中的#和##是什么”的内容了,经过本文的学习后,相信大家对C语言宏定义中的#和##是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: Vue递归组件使用技巧实例代码分析

这篇文章主要介绍“Vue递归组件使用技巧实例代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue递归组件使用技巧实例代码分析”文章能帮助大家解决问题。在平时的开发当中,渲染侧边栏导航菜单有时会遇到过需要侧边栏有…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/06 22:19
Next 07/06 22:19

相关推荐