学习boost预编译的代码

本文探讨了如何通过预编译宏STR来查看Boost代码的宏置换结果,特别是深入分析了BOOST_PP_AUTO_REC和BOOST_PP_WHILE宏。BOOST_PP_WHILE宏需要三个参数,用于定义循环结束条件和每次循环执行的操作。它通过BOOST_PP_IIF和BOOST_PP_TUPLE_EAT_3等工具宏实现非递归的循环逻辑,以防止编译器陷入死循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

boost的代码很难看懂,从今天起每天看一点。

【1】在通过编译前,查看宏置换的结果,即方便解决编译问题,又方便分析代码,方法如下

#define STR(a) STR_I(a)
#define STR_I(a) #a

printf(STR(SOME_MARCO(xxx)));

再用此方法看看最难懂的宏之一 BOOST_PP_AUTO_REC的置换结果(注意包含对应的头文件)

 printf(STR(BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4)));
 printf("\n");
 printf(STR(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256)));
 printf("\n");
 printf(STR(BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256)));
 printf("\n");
 printf(STR(BOOST_PP_AUTO_REC(BOOST_PP_SEQ_FOLD_LEFT_P, 256)));
 printf("\n");

打印出来的结果全是“1”,很意外,那么这个宏到底起什么作用呢?

猜测1:对输入的第一个参数进行校验,确定是有效的宏,避免编译器进入死循环什么的

猜测2:提高编译速度,减少宏置换时的递归深度

 

【2】BOOST_PP_WHILE宏的作用

BOOST_PP_WHILE 被置换成BOOST_PP_WHILE_1,看代码从这里看起,不要管那个BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256)
该宏需要三个参数,第一个是被称为pred的宏,负责生成循环结束条件;第二个是被称为op的宏,就是每次循环要执行的操作;第三个是被操

作的参数,格式为(a,b,c,d)中间可以有任意个元素,在boost中这种格式被称为tuple;该宏的返回值也是一个tuple。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值