boost的源码有许多让奇技淫巧,文件迭代也不例外。这又算作一巧吧。
boost使用手册告诉我下面三行代码可以将try.h头文件包含5次。
#define BOOST_PP_ITERATION_LIMITS (5, 10)
#define BOOST_PP_FILENAME_1 "try.h"
??=include BOOST_PP_ITERATE()
(其中??=与#等价)
前两个宏都是我自己定义的,只有BOOST_PP_ITERATE是boost定义的。因此,所有的秘密都在这个宏定义中。
我把BOOST_PP_ITERATE所有用到的宏定义都列出如下
# define BOOST_PP_ITERATION_DEPTH() 0
#define BOOST_PP_CAT(a, b) a##b
# define BOOST_PP_INC(x) BOOST_PP_INC_ ## x
# define BOOST_PP_INC_0 1
# define BOOST_PP_ITERATE() BOOST_PP_CAT(BOOST_PP_ITERATE_, BOOST_PP_INC(BOOST_PP_ITERATION_DEPTH()))
# define BOOST_PP_ITERATE_1 <boost/preprocessor/iteration/detail/iter/forward1.hpp>
手工展开,得到如下的结果
# define BOOST_PP_ITERATE() <boost/preprocessor/iteration/detail/iter/forward1.hpp>
终于搞明白了。现在写一个程序来测试。
try.cpp
try.h
这里使用了一个整数模板类TESTERROR来输入错误日志,以观察每次迭代的BOOST_PP_ITERATION_1值。
TESTERROR只特化了-1的值,而BOOST_PP_ITERATION_1的值从5变化到10,因此,编译器会无法找到匹配的模板实例
我使用VC2005编译器报错如下:
1>正在编译...
1>try.cpp
1>TEST FILE ITERATION
1>e:/project/try/try.h(4) : error C2079: “ComplieError”使用未定义的 struct“TESTERROR<__formal>”
1> with
1> [
1> __formal=5
1> ]
1>TEST FILE ITERATION
1>e:/project/try/try.h(4) : error C2079: “ComplieError”使用未定义的 struct“TESTERROR<__formal>”
1> with
1> [
1> __formal=6
1> ]
1>e:/project/try/try.h(4) : error C2086: “int ComplieError”: 重定义
1> e:/project/try/try.h(4) : 参见“ComplieError”的声明
1>TEST FILE ITERATION
1>e:/project/try/try.h(4) : error C2079: “ComplieError”使用未定义的 struct“TESTERROR<__formal>”
1> with
1> [
1> __formal=7
1> ]
1>e:/project/try/try.h(4) : error C2086: “int ComplieError”: 重定义
1> e:/project/try/try.h(4) : 参见“ComplieError”的声明
1>TEST FILE ITERATION
1>e:/project/try/try.h(4) : error C2079: “ComplieError”使用未定义的 struct“TESTERROR<__formal>”
1> with
1> [
1> __formal=8
1> ]
1>e:/project/try/try.h(4) : error C2086: “int ComplieError”: 重定义
1> e:/project/try/try.h(4) : 参见“ComplieError”的声明
1>TEST FILE ITERATION
1>e:/project/try/try.h(4) : error C2079: “ComplieError”使用未定义的 struct“TESTERROR<__formal>”
1> with
1> [
1> __formal=9
1> ]
1>e:/project/try/try.h(4) : error C2086: “int ComplieError”: 重定义
1> e:/project/try/try.h(4) : 参见“ComplieError”的声明
1>TEST FILE ITERATION
1>e:/project/try/try.h(4) : error C2079: “ComplieError”使用未定义的 struct“TESTERROR<__formal>”
1> with
1> [
1> __formal=10
1> ]
可以看到BOOST_PP_ITERATION_1的值从5变化到10