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。<