返回信息流看到一段代码如下:
/// 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
多写两遍有什么好处吗? 注释看不明白
这是一条镜像帖。来源:北邮人论坛 / cpp / #92694同步于 2016/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
宏定义中的##
xiaobing307
2016/7/21镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
也不明白为啥要封装两次
【 在 xiaobing307 (小兵) 的大作中提到: 】
: 看到一段代码如下:
: [code=c]
: /// This piece of macro joins the two
: ...................
[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
: ...................
这样看起来用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`)
: ...................