一个关于define的问题,谢谢
#define cat(x,y) x##y concatenates x to y. But cat(cat(1,2),3) does not expand
but gives preprocessor warning. Why?
问题点数:20、回复次数:7Top
1 楼cunsh(村少)回复于 2006-03-04 20:28:11 得分 0
你想做什么?Top
2 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2006-03-04 20:31:06 得分 1
像这种递归的宏展开, 编译器好像没能力去做.Top
3 楼dhongda()回复于 2006-03-04 20:48:21 得分 0
但是 如果改成#define cat(x,y) x+y cat(cat(1,2),3)就可以了,也是低归的,就能通过编译Top
4 楼Slime_wu()回复于 2006-03-05 13:16:58 得分 2
等解答,帮顶
Top
5 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 14:13:18 得分 15
很简单,第一次展开后变为:
cat(1,2)3 注意,这中间没有空格,所以不能继续展开了。
这时已经出现了错误,编译器不会继续处理了。
你可以在程序里直接写 cat(1,2)3, 是无法通过的。
如果是加的话, cat(1,2)+3 还可以继续进行预处理,所以可以通过啊Top
6 楼dx30611(想要clean code)回复于 2006-03-05 14:13:48 得分 1
LZ搞错了##的含义
#define cat(x,y) x+y是将cat(x,y)解释为x和y的数值相加
而#define cat(x,y) x##y是将cat(x,y)解释为x字符和y字符的相连也就是说cat(x,y)等同于xyTop
7 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-05 14:21:27 得分 1
我想这大概是因为编译器大多会把预处理和词法分析之类的一起完成,
所以多层的预处理需要保证每一次处理之后词法都是正确的。
如果单纯只进行预处理的话, cat(1,2)3 这样的也是可以被替换出来的。Top




