【问题标题】:Create two different code block with one macro使用一个宏创建两个不同的代码块
【发布时间】:2014-06-15 22:14:42
【问题描述】:

我想编写一个有一个参数的宏,并将这个参数添加到一个枚举中并创建一个具有相同名称的类。在 C++ 中可能吗?如果是,比如何?

为了更清楚,这里是我想做的一个例子:

我这样调用宏:

REGISTER(A);
REGISTER(B);
REGISTER(C);

或者像这样调用宏:

REGISTER(A, B, C);

我想让预处理器生成这样的代码:

enum X { E_A, E_B, E_C };
class A {};
class B {};
class C {};

【问题讨论】:

  • 这是一种快速消除歧义的方法。
  • 感谢您指出。我修复了它,但这并没有改变问题的目标。
  • 对于与类名冲突的 enum 值:您也可以考虑使用 C++11 的 enum class 恕我直言,这将以更优雅的方式防止问题。

标签: c++ macros c-preprocessor


【解决方案1】:

这样的事情可能会有所帮助:

#define FE_1(WHAT, X) WHAT(X) 
#define FE_2(WHAT, X, ...) WHAT(X)FE_1(WHAT, __VA_ARGS__)
#define FE_3(WHAT, X, ...) WHAT(X)FE_2(WHAT, __VA_ARGS__)
#define FE_4(WHAT, X, ...) WHAT(X)FE_3(WHAT, __VA_ARGS__)
#define FE_5(WHAT, X, ...) WHAT(X)FE_4(WHAT, __VA_ARGS__)
//... repeat as needed

#define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME 
#define FOR_EACH(action,...) \
  GET_MACRO(__VA_ARGS__,FE_5,FE_4,FE_3,FE_2,FE_1)(action,__VA_ARGS__)

#define REGISTER_ENUM_VALUE(X) E_##X,
#define REGISTER_ENUM(...) enum X { FOR_EACH(REGISTER_ENUM_VALUE, __VA_ARGS__) }
#define REGISTER_CLASS(X) ; class X {}
#define REGISTER(...) REGISTER_ENUM(__VA_ARGS__) FOR_EACH(REGISTER_CLASS, __VA_ARGS__)

REGISTER(A, B, C);

请注意,您无法获得真正的可变参数 FOR_EACH,它将始终被限制为您正在计划并手动实施的某个最大参数数量。至少还没有人找到解决方法:)

Live example

致谢:一些代码从here“窃取”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多