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

#define cat(x,y) x##y cat(cat(1,2),3)为什么不能编译成123

Mulany
2013/7/14镜像同步12 回复
而是生成了记号 cat(1,2)3 这是为神马??
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Mulany机器人#1 · 2013/7/15
up
txmm机器人#2 · 2013/7/15
类似这样的理由。可以尝试双重扩展 stringification
lt123345机器人#3 · 2013/7/15
如果一个宏定义包含#或##,那么宏参数不会被展开,参见http://blog.chinaunix.net/uid-27714502-id-3461678.html cat的定义里有##, 而cat(cat(1,2),3)的第一个参数是cat(1,2),它不再被展开,最后整个表达式被解释成了cat(1,2)##3 --> cat(1,2)3就停止了。。。然后我的编译器报错 pasting ")" and "3" does not give a valid preprocessing token
Mulany机器人#4 · 2013/7/15
额 什么是双重扩展 木有听说过 【 在 txmm 的大作中提到: 】 : 类似这样的理由。可以尝试双重扩展 : stringification
Mulany机器人#5 · 2013/7/15
有道理的样子,就是一时没怎么看明白,再研究研究 【 在 lt123345 的大作中提到: 】 : 如果一个宏定义包含#或##,那么宏参数不会被展开,参见http://blog.chinaunix.net/uid-27714502-id-3461678.html : cat的定义里有##, 而cat(cat(1,2),3)的第一个参数是cat(1,2),它不再被展开,最后整个表达式被解释成了cat(1,2)##3 --> cat(1,2)3就停止了。。。然后我的编译器报错 : pasting ")" and "3" does not give a valid preprocessing token
LafengHu机器人#6 · 2013/7/15
这么那么复杂么。。 你第一次展开是时候,变成了cat(1,2)3,这货编译器根本就不认识好么 难道你#define cat 2; #define dog 3; 然后代码里写catdog,可以直接给你转化成23么? 明显是未定义的标识符,只有有定义的才会转化
awds888机器人#7 · 2013/7/15
额,呵呵,多年之后居然还能看到有人转载我写的东西,最早在csdn上回复时写的。 http://bbs.csdn.net/topics/310177034 【 在 lt123345 的大作中提到: 】 : 如果一个宏定义包含#或##,那么宏参数不会被展开,参见http://blog.chinaunix.net/uid-27714502-id-3461678.html : cat的定义里有##, 而cat(cat(1,2),3)的第一个参数是cat(1,2),它不再被展开,最后整个表达式被解释成了cat(1,2)##3 --> cat(1,2)3就停止了。。。然后我的编译器报错 : pasting ")" and "3" does not give a valid preprocessing token
Mulany机器人#8 · 2013/7/16
为什么不是先从里面开始展开呢?那样的话就是cat(12,3)了啊 【 在 LafengHu 的大作中提到: 】 : 这么那么复杂么。。 : 你第一次展开是时候,变成了cat(1,2)3,这货编译器根本就不认识好么 : 难道你#define cat 2; #define dog 3; : ...................
bug11120509机器人#9 · 2013/7/16
#define cat(x,y) x##y cat(cat(1,2),3) 1.最外层括号中的逗号为实参分隔符,内层的不分隔该层实参; 2.带有预处理指令#或##的形参,不参与宏替换或宏展开 针对宏中嵌套宏,应该从最外层往里开始替换: 及cat(1,2)##3 扫描发现cat(1,2)依然是宏,但是有##故不干预宏替换或宏展开 故得:cat(1,2)3