关于宏

lbh2001 2008-07-29 11:02:16
#define CONCAT(x,y) x##y

CONCAT(a,CONCAT(b,c))扩展为aCONCAT(b,c)而导致出错

解决方案是定义第二个宏

#define CONCAT2(x,y) CONCAT(x,y)

CONCAT2(a,CONCAT2(b,c))扩展为想要的结果abc

我的问题是详细的具体步骤是什么

最好用以下格式解释

#define plus(x,y) add(y,x)
#define add(x,y) ((x)+(y))

plus(plus(a,b),x)的扩展步骤

初始 plus(plus(a,b),c)
add(c,plus(a,b))
((c)+(plus(a,b)))
((c)+(add(b,a)))
最后 ((c) +(((b)+(a))))
...全文
208 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_sharp 2008-07-29
  • 打赏
  • 举报
回复
UP
lbh2001 2008-07-29
  • 打赏
  • 举报
回复
我知道有##连接的宏嵌套时会产生这个问题,只需把这种情况特殊处理

但我的问题是
CONCAT2(a,CONCAT2(b,c))详细的扩展步骤直到想要的结果abc

iBug168 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xkyx_cn 的回复:]
有##连接的宏嵌套时会产生这个问题,只需把这种情况特殊处理
[/Quote]
xiao_ke 2008-07-29
  • 打赏
  • 举报
回复
我觉得这个向前引用有关
#define CONCAT(x,y) x##y

CONCAT(a,CONCAT(b,c)) 在做宏替换的时候他先替换CONCAT(a, X), 这个X表示CONCAT(b,c), 然后再往上找CONCAT(b,c)就找不到了(应该在CONCAT前没有CONCAT这个宏了)所以被直接替换成了aCONCAT(b,c)

以上纯属猜测:)
只要记得这种特殊情况就行了~
xkyx_cn 2008-07-29
  • 打赏
  • 举报
回复
有##连接的宏嵌套时会产生这个问题,只需把这种情况特殊处理
tangshuiling 2008-07-29
  • 打赏
  • 举报
回复
mark!
xkyx_cn 2008-07-29
  • 打赏
  • 举报
回复
是这样的

[Quote=引用 9 楼 lbh2001 的回复:]
谢谢各位,现在我的理解是这样的,不知对否

C标准上说,在替换列表中,位于##运算符之前和之后的宏参数在替换时不被扩展,
所以CONCAT(a,CONCAT(b,c))扩展为aCONCAT(b,c),因为没有aCONCAT的宏而导致
出错。

对于CONCAT2(a,CONCAT2(b,c)),由于CONCAT2的替换列表中不包含##,所以在
扩展外面的CONCAT2调用时,预处理器将会同时扩展CONCAT2(b,c)并得到结果bc,
所以嘛:
CONCAT2(a, CONCAT2(b, c))---->CONCAT(…
[/Quote]
lbh2001 2008-07-29
  • 打赏
  • 举报
回复
谢谢各位,现在我的理解是这样的,不知对否

C标准上说,在替换列表中,位于##运算符之前和之后的宏参数在替换时不被扩展,
所以CONCAT(a,CONCAT(b,c))扩展为aCONCAT(b,c),因为没有aCONCAT的宏而导致
出错。

对于CONCAT2(a,CONCAT2(b,c)),由于CONCAT2的替换列表中不包含##,所以在
扩展外面的CONCAT2调用时,预处理器将会同时扩展CONCAT2(b,c)并得到结果bc,
所以嘛:
CONCAT2(a, CONCAT2(b, c))---->CONCAT(a, bc)---->abc
xkyx_cn 2008-07-29
  • 打赏
  • 举报
回复
宏里有##时,替换优先于展开,所以会发生CONCAT(a,CONCAT(b,c))扩展为aCONCAT(b,c)
对于第二种情况:
#define CONCAT2(x,y) CONCAT(x,y)
CONCAT2(a,CONCAT2(b,c))
CONCAT2里没有特殊的操作符,所以要先执行展开,即先计算宏的值:
CONCAT2(a,CONCAT2(b,c)) ---> CONCAT2(a,bc) ---> abc
lbh2001 2008-07-29
  • 打赏
  • 举报
回复
CONCAT2(a, CONCAT2(b, c))
->CONCAT(a, CONCAT2(b, c))
->aCONCAT2(b, c)-------------> OK
|
|--------------> ???,能这样吗
|
V
->aCONCAT(b, c)
|
|--------------> ???
|
V
->abc
kitcaii 2008-07-29
  • 打赏
  • 举报
回复

CONCAT2(a, CONCAT2(b, c))
->CONCAT(a, CONCAT2(b, c))
->aCONCAT2(b, c)
->aCONCAT(b, c)
->abc

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧