BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #92694同步于 2016/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

宏定义中的##

xiaobing307
2016/7/21镜像同步4 回复
看到一段代码如下: /// This piece of macro joins the two /// parameters together. The key /// is that macro expansion of macro arguments does not /// occur in MACRO_JOIN2 but does in MACRO_JOIN1. #define MACRO_JOIN(a, b) MACRO_JOIN1(a, b) #define MACRO_JOIN1(a, b) MACRO_JOIN2(a, b) #define MACRO_JOIN2(a, b) a##b 多写两遍有什么好处吗? 注释看不明白
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
jh1机器人#1 · 2016/7/21
也不明白为啥要封装两次 【 在 xiaobing307 (小兵) 的大作中提到: 】 : 看到一段代码如下: : [code=c] : /// This piece of macro joins the two : ...................
zx723机器人#2 · 2016/7/21
macro expansion
Vampire机器人#3 · 2016/7/21
[https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan](https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan) 直接用 `MACRO_JOIN2` 的话(`clang -E -xc test.c`) * `MACRO_JOIN2(a, MACRO_JOIN2(b, c))` 得到 `aMACRO_JOIN2(b, c)`, * `MACRO_JOIN2(MACRO_JOIN2(a, b), c)` 报错 而以上两例用 `MACRO_JOIN` 才能获得正确结果 因为 `MACRO_JOIN2` 里面会 paste 两个参数(`##`),所以不会做参数展开。而 `MACRO_JOIN` 没有 paste 和 stringify(`#`)所以会先完全展开参数,然后再做替换。 【 在 xiaobing307 的大作中提到: 】 : 看到一段代码如下: : [code=c] : /// This piece of macro joins the two : ...................
cyf333333机器人#4 · 2016/7/22
这样看起来用JOIN1就够了啊。。。。为什么要做来一个JOIN[ema27] 【 在 Vampire 的大作中提到: 】 : [md] : [https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan](https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan) : 直接用 `MACRO_JOIN2` 的话(`clang -E -xc test.c`) : ...................