Макро счетчик
Можно ли создать константы времени компиляции следующим образом:
// 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()
куда SOME_EVENT
будет 0 и SOME_OTHER_EVENT
будет 1.
Пробовал следующий код:
#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)
Но включить ест постоянную декларацию.
1 ответ
Да, это возможно, но с const/constexpr int
и с Boost.Preprocessor.
Смотрите BOOST_PP_COUNTER
Пример использования:
#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
Смотрите рабочий пример.
Последнее замечание: не используйте макрос для хранения результатов, вы получите одинаковое число в конце всех таких определенных констант:
#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; }
Выход:
11