加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

c++ 预处理的图灵完备之引言

发布时间:2020-12-31 06:12:21 所属栏目:创业 来源:网络整理
导读:我们还是来讨论c++吧,这几年在c++里面玩代码自动生成技术,而预处理是不可避免,也是不可或缺的重要工具。虽然boost pp预处理库在宏的运用上很是完善,但是代码也太多了,而且代码很不好理解,对此,不免让人疑惑,有必要搞得那么复杂,搞那么多代码吗?并

然后,这样调用,
PAIR_SECOND(MAKE_PAIR(10,20))
编译器马上就不高兴了,warning C4003: “PAIR_SECOND”宏的实参不足
好像是编译器没有先展开MAKE_PAIR(10,20),然后再调用PAIR_SECOND,而是直接把MAKE_PAIR(10,20)整个当成一个函数传给PAIR_SECOND,然后,PAIR_SECOND就提示实参不足,然后,硬要测试,
PP_ASSERT(PAIR_SECOND(MAKE_PAIR(10,20)) == 20)
显然,无论如何,编译器势必就龙颜大怒了。对此,我们只好再引入间接层,想办法让MAKE_PAIR(10,20)先展开,然后再传给PAIR_SECOND。这样,就不能直接用这样的形式了,PAIR_SECOND(MAKE_PAIR(10,20)) 。只好改成这样,下面的几行代码,很有点惊天地泣鬼神的味道。

#define _ZPP_INVOKE_JOIN(_A,_B) _ZPP_IMP_INVOKE_JOIN_I(_A,_B)
#define _ZPP_IMP_INVOKE_JOIN_I(_A,_B) _ZPP_IMP_INVOKE_JOIN_II(~,_A##_B)
#define _ZPP_IMP_INVOKE_JOIN_II(p,res) res

#define PP_INVOKE(m,args,) _ZPP_INVOKE_JOIN(m,args) 

前面几行代码都是PP_INVOKE的JOIN函数实现,可以直接当它们是JOIN函数,关键是PP_INVOKE(m,...)这里,第一个参数m是宏函数,第二个是args,是要传给第一个参数m的参数列表,用括号括起来,至于后面的省略号,是有些时候为了取悦编译器而添加的,也不知道是什么原因,反正这样子就可以了,懒得追究。垃圾宏,垃圾预处理,只要能完成功能就行了,c++中,代码生成代码,重头戏在tmp那里,宏只是小小必要的辅助工具而已。然后,这样调用,
PP_ASSERT(PP_INVOKE(PAIR_SECOND,(MAKE_PAIR(10,20))) == 20)
编译通过了,好不容易啊!

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读