关于宏替换的顺序
看过csdn50楼的帖子 : http://topic.youkuaiyun.com/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)
整个过程就是一个递归替换的过程.