Macro-based counter
是否可以像这样创建编译时常量:
1 2 3 4 5 6 7 | // event.h #define REGISTER_EVENT_TYPE() ... // Returns last_returned_number+1 // header1 #define SOME_EVENT REGISTER_EVENT_TYPE() // header2 #define SOME_OTHER_EVENT REGISTER_EVENT_TYPE() |
其中
尝试了以下代码:
1 2 3 4 | #define DEF_X(x) const int x = BOOST_PP_COUNTER; #define REGISTER_EVENT_TYPE(x) BOOST_PP_UPDATE_COUNTER()DEF_X(x) #include REGISTER_EVENT_TYPE(SOME_EVENT_TYPE) |
但是包含吃常量声明。
是的,这是可能的,但是使用
见 BOOST_PP_COUNTER
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <boost/preprocessor/slot/counter.hpp> constexpr int A = BOOST_PP_COUNTER; // 0 #include BOOST_PP_UPDATE_COUNTER() constexpr int B = BOOST_PP_COUNTER; // 1 #include BOOST_PP_UPDATE_COUNTER() constexpr int C = BOOST_PP_COUNTER; // 2 #include BOOST_PP_UPDATE_COUNTER() constexpr int D = BOOST_PP_COUNTER; // 3 |
参见工作示例。
最后注意:不要使用宏来存储结果,你会在所有这些定义的常量中得到相同的数字:
1 2 3 4 5 6 7 8 9 | #include <boost/preprocessor/slot/counter.hpp> #define A BOOST_PP_COUNTER // A is 0 #include BOOST_PP_UPDATE_COUNTER() #define B BOOST_PP_COUNTER // B is 1, but A is 1 too int main() { cout << A << B << endl; } |
输出:
1 | 11 |