【问题标题】:Macro-based counter基于宏的计数器
【发布时间】:2015-02-25 16:28:09
【问题描述】:

是否可以像这样创建编译时常量:

// 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)  

但包含吃常量声明。

【问题讨论】:

  • 您想要一个每次“调用”时都返回不同常量的宏?我很确定这是不可能的。
  • 宏是编译时的,你在执行时要求数据...不可能。

标签: c++ c++11 boost boost-preprocessor


【解决方案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

working example


最后注意:不要使用宏来存储结果,你会在所有这些定义的常量中得到相同的数字:

#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

【讨论】:

  • 谢谢,但我知道 BOOST_PP_COUNTER,我正在尝试找到一种方法将以下代码包装到单个宏中。 constexpr int A = BOOST_PP_COUNTER; #include BOOST_PP_UPDATE_COUNTER()
  • @DejaVu - 请记住始终添加或至少提及您迄今为止尝试过的内容。无论如何:我留下这个答案。我希望它对其他人有用。
  • @DejaVu - 在评论中回答您的问题:嗯 - 您不能在宏定义中使用 #。恐怕新ID需要两行代码,或者,你为什么不直接使用enum...
猜你喜欢
  • 2011-10-11
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多