C/C++宏的替换顺序[整理总结]

关于宏替换的顺序
看过csdn50楼的帖子 :      http://topic.csdn.net/u/20090727/18/457c61bd-7461-431c-bbf9-924865cfe43c.html 之后的 总结


 
总结:
 
<1>   不管书写的代码是不是跨平台的,当替换路径中出现  operator#  与 operator## 时, 替换的次序可能会不会如标准所说.所以这种代码是晦涩的.不安全的.C++给出的解决方案时 inline (template)函数, 兼顾高效与类型安全. 注意: non-member inline 函数是内部链接的.所以除非明确需求,必须把函数定义写在 头文件中.如果写在cpp中,建议使用 unamed namespace 包裹,以明确表达内部链接的需要.
 
<2>   即使替换路径中不含有 ##   或者 # ,宏替换的替换语义依然晦涩.替换的次数可不大适合口算.so,替换的嵌套层次越少越好
 
<3>   operator#  会吃掉实参连续的空格,只留下一个
 
<4>   宏替换的实参不能够有任何 side affect , 否则会因为多次替换产生问题
 
<5>   function-like macro 替换顺序::
 
[1]  把宏读入,最外层(  )外面的宏进入 replacement-list.
 
[2]  按照最外层(  )内的,[内层,不考虑] 分割,替换实参.
 
[3]  检查哪些实参前面有 #  或者 ## , 或者 实参后面有 ##. 执行 operator #  与 operator ##,  operator#后实参转换成为文字量.  operator##连接实参,然后把连接后的结果压入replacement-list
 

[4]  否则, 把实参压入 replacement-list,检查实参是否以前被替换过,如果替换过,停止替换. 去掉最外层(). 回到步骤 (1)

 
整个过程就是一个递归替换的过程.
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值