【发布时间】:2011-04-08 11:44:58
【问题描述】:
这是给 C 预处理器专家的:
如何声明带有一些标识符列表的enum,然后在 switch 语句检查列表中是否包含标识符?
我需要的示例:
typedef enum { e1, e2, e3, e4, e5, e6 } e;
e x;
switch (x) {
#if DECLARED_IN_ENUM (e1)
case e1 : ...
#endif
/* etc. */
}
我想过使用 Boost 序列并将其扩展为枚举中的逗号分隔列表,但是我以后如何检查该序列是否包含某个标记?
编辑:我能用 Boost 做的是:
#define e1 e1
#define e2 e2
#define e3 e3
#define e4 e4
#define e5 e5
#define e6 e6
#define E (e1)(e2)(e3)(e4)(e5)(e6)
typedef enum { BOOST_PP_SEQ_ENUM(E) } e;
e x;
switch (x) {
#if defined (e1)
case e1 : ...
#endif
/* etc. */
}
这不是很漂亮,我更喜欢这样的东西:
#define E (e1)(e2)(e3)(e4)(e5)(e6)
typedef enum { BOOST_PP_SEQ_ENUM(E) } e;
e x;
switch (x) {
#if BOOST_PP_SEQ_CONTAINS (e1,E)
case e1 : ...
#endif
/* etc. */
}
但是如何实现BOOST_PP_SEQ_CONTAINS?
【问题讨论】:
-
我删除了 C 标记,因为你也标记了 boost。
-
Boost 预处理器宏应该独立于 C++ 扩展,因此它们也可以在 C 中使用。
标签: c++ boost c-preprocessor boost-preprocessor