免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4027 | 回复: 1
打印 上一主题 下一主题

递归包含宏定义的解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-20 14:08 |只看该作者 |倒序浏览
30可用积分
《语言程序设计现代方法》244页说:按照C语言标准,如果在扩展宏的过程中原先的宏名重复出现的话,宏名不会再次被替换。

这样宏定义中如果出现互相包含的两个定义。哪个规则在前,哪个有效。
这种定义有什么意义呢?

例如在 i686-w64-mingw32\include\stdio.h 109,110行定义出现这样的语句:
  1. #define __iob_func()        (* __MINGW_IMP_SYMBOL(_iob))
  2. #define _iob __iob_func()
复制代码
这种定义有必要吗?直接把第二句删除,有什么问题吗?

论坛徽章:
0
2 [报告]
发表于 2012-05-06 11:32 |只看该作者
理论我不清楚,但我的实践经验,是不能简单的将第二句删除的。
如果__MINGW_IMP_SYMBOL是另一个宏,那么两句的效果与一句的效果就会有差异。

这里有一个我的实际例子:
#define __DEC_CFuncAtDestruct_INST(pos, arg1, arg2) CFuncAtDestruct<typeof(*arg1), typeof(*arg2)> auto_CFuncAtDestruct_##pos(arg1, arg2)
#define _DEC_CFuncAtDestruct_INST(pos, arg1, arg2) __DEC_CFuncAtDestruct_INST(pos, arg1, arg2)
#define DEC_CFuncAtDestruct_INST(arg1, arg2) _DEC_CFuncAtDestruct_INST(__LINE__, arg1, arg2)

按照简单的理解,第二个宏是可以不要的,但偏偏那么奇怪,不要了它,第1个宏并不以将pos展开为__LINE__对应的值,而只能展开为__LINE__这几个字符。
效果就是,只有这三个宏一起,第二个宏作一个简单的中转,第一个宏才能按照预期进行工作。


------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的生涯|IT人的故事]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP