返回信息流而是生成了记号 cat(1,2)3
这是为神马??
这是一条镜像帖。来源:北邮人论坛 / cpp / #72612同步于 2013/7/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
#define cat(x,y) x##y cat(cat(1,2),3)为什么不能编译成123
Mulany
2013/7/14镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
如果一个宏定义包含#或##,那么宏参数不会被展开,参见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
有道理的样子,就是一时没怎么看明白,再研究研究
【 在 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
这么那么复杂么。。
你第一次展开是时候,变成了cat(1,2)3,这货编译器根本就不认识好么
难道你#define cat 2; #define dog 3;
然后代码里写catdog,可以直接给你转化成23么?
明显是未定义的标识符,只有有定义的才会转化
额,呵呵,多年之后居然还能看到有人转载我写的东西,最早在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
为什么不是先从里面开始展开呢?那样的话就是cat(12,3)了啊
【 在 LafengHu 的大作中提到: 】
: 这么那么复杂么。。
: 你第一次展开是时候,变成了cat(1,2)3,这货编译器根本就不认识好么
: 难道你#define cat 2; #define dog 3;
: ...................
#define cat(x,y) x##y
cat(cat(1,2),3)
1.最外层括号中的逗号为实参分隔符,内层的不分隔该层实参;
2.带有预处理指令#或##的形参,不参与宏替换或宏展开
针对宏中嵌套宏,应该从最外层往里开始替换:
及cat(1,2)##3
扫描发现cat(1,2)依然是宏,但是有##故不干预宏替换或宏展开
故得:cat(1,2)3