【问题标题】:Getting size of enum using preprocessor使用预处理器获取枚举的大小
【发布时间】:2014-11-11 08:05:46
【问题描述】:

我正在尝试找到一种计算枚举长度的方法,而不是在枚举末尾添加一个“COUNT”元素。我找到了一种使用预处理器的方法,如下所示。

#include <iostream>
#include <boost/preprocessor/tuple/elem.hpp>

//simple declaration
template <class E>
struct enum_size;

//specialization is done in the macro for each enum created
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__};   \
  template <>                       \
  struct enum_size<name> {                  \
    static const int value = BOOST_PP_VARIADIC_SIZE(__VA_ARGS__);   \
    };

MAKE_ENUM(my_enum1, a, b, c)
//MAKE_ENUM(my_enum2, a) //triggers compilation error

int main(int argc, char** argv) {
  std::cout << enum_size<my_enum1>::value << std::endl;
}

但是,当我尝试按上述方式创建 my_enum2 时,我从编译器(CygWin 上的 GCC 4.8.3)收到如下重新声明错误

main.cpp:16:21: error: redeclaration of 'a'
 MAKE_ENUM(my_enum2, a)
                 ^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM'
 #define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \
                                     ^
main.cpp:15:21: note: previous declaration 'my_enum1 a'
 MAKE_ENUM(my_enum1, a, b, c)
                 ^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM'
 #define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \

如果我将有问题的行更改为MAKE_ENUM(my_enum2, e),那么它可以干净地编译。任何想法这里有什么问题以及我该如何解决?提前致谢!

【问题讨论】:

标签: c++ boost enums boost-preprocessor


【解决方案1】:

变量a 已经输入my_enum1,你不能重新声明它。您可以通过几种方式解决此问题

1) 如果您有 C++11,请使用 enum class,而不是 enum

#define MAKE_ENUM(name, ...) enum class name {__VA_ARGS__};

2) 您可以将enum 放入namespace

【讨论】:

  • 不会name ## __VA_ARGS__ 只将name 添加到第一个变量吗?
  • @ForEver:谢谢,我完全错过了这一点。解决方案 1) 可以正常工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多