《c程序设计语言》中的例子-宏

not_smart 2005-10-06 02:32:08
看书的时候,有个地方不是很明白,请各位牛人帮帮忙

"在定义 #define cat(x,y) x##y 后,宏调用cat(var,123)产生var123,但是,宏调用cat(cat(1,2),3)没有定义:#的存在限制了外部调用的变元的扩展,因此将产生字符串 cat(1,2)3 并且)3不是合法的单词,它由第一个变元的最后一个单词与第二个变元的第一个单词连接而成。如果再进行第二层的宏定义:#define xcat(x,y) cat(x,y) 那么就会得到所要的效果:xcat(xcat(1,2),3)将产生123,因为xcat自身的扩展不包含##操作符。"

不明白,宏的解释顺序是如何的,像这种嵌套的情况。

在原书第二版附录A的201页
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
什么意思
jixingzhong 2005-10-07
  • 打赏
  • 举报
回复
楼主对于这样的问题, 自己揭开这个替换不就好了 :

根据你的定义:
1 cat(cat(1,2),3) ==> cat(1,2)##3 = cat(1,2)3
2 xcat(xcat(1,2),3)==> 1##2##3 = 123

楼主理解了不 ?
jixingzhong 2005-10-07
  • 打赏
  • 举报
回复
不明白,宏的解释顺序是如何的,像这种嵌套的情况。
-----------------------------------------------

这个无所谓顺序的吧, 反正都是 define ,都要替换的啊, 替换的时候又没有任何的其他运算进行, 这个顺序如何, 对程序可以说是没有一丝的影响的啊!

你的前面的问题, 很明显的啊, 第 2 种方法是 双重的, 于是, 进行两层的替换, 得到的不就是你要的串么 ?

第一个, 根据你的定义, cat(cat(1,2),3) ,直接连接, 得到的就是 cat(1,2)3 啊, 怎么说没有定义呢?
jixingzhong 2005-10-07
  • 打赏
  • 举报
回复
define 没有类型限制, 限制了也没有用的, 编译的时候不会检查这个东西.

这个就是 define 和 inline 的区别, 不过, C 中没有 inline , 不必理会这个区别 !
xiaocai0001 2005-10-06
  • 打赏
  • 举报
回复
还有类型限制???

那我没招~~
not_smart 2005-10-06
  • 打赏
  • 举报
回复
谢谢 xiaocai0001(萧筱雨) 大哥,方法很好。
可是,有没有用到类型t的方法呢?(毕竟问题中提供了这个条件啊)
xiaocai0001 2005-10-06
  • 打赏
  • 举报
回复
定义宏swap(t,x,y),用于交换类型为t的两个变量x,y(使用分程序结构)。

----------------
不用临时变量

#define swap(x,y) {(x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y);}
not_smart 2005-10-06
  • 打赏
  • 举报
回复
还有一个问题,哪位大哥顺便帮我解决了吧。

练习4-14

定义宏swap(t,x,y),用于交换类型为t的两个变量x,y(使用分程序结构)。

不知道如何定义类型为t的临时变量,难道不用临时变量?或者和c++中那样可以在程序中定义变量?

69,373

社区成员

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

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