我想创建一个递归的宏将创建“下一步”类。
例:
#define PRINTME(indexNum) class m_##(indexNum+1) { }
所述indexNum + 1
被评价为int
,并且不会级联到的类名。
我怎样才能使编译器评估的是,在连接前?
我想创建一个递归的宏将创建“下一步”类。
例:
#define PRINTME(indexNum) class m_##(indexNum+1) { }
所述indexNum + 1
被评价为int
,并且不会级联到的类名。
我怎样才能使编译器评估的是,在连接前?
简单的答案是,你不能。 预处理一般成交在文本和标记; 唯一的地方算术中进行#if
和#elif
的指令。
此外,宏扩展不是递归。 在膨胀期间,被扩展宏被禁用,并且不适用于进一步取代。
如果你想生成唯一的类名每次时间PRINTME
被调用的话,下面是一个方法:
#define CONCATE1(X,Y) X##Y
#define CONCATE(X,Y) CONCATE1(X,Y)
#define PRINTME class CONCATE(m_,__COUNTER__) {}
__COUNTER__
是GCC的扩展,我不知道它是否存在于其他的编译器。 它保证了编译器将每到这个调用宏时加1。
(在这种情况下,您不能使用__LINE__
和__FILE__
有效。)
演示 。
那么它是可行的,根据你的动机和忍受丑陋的代码的能力。 首先定义增量宏:
#define PLUS_ONE(x) PLUS_ONE_##x
#define PLUS_ONE_0 1
#define PLUS_ONE_1 2
#define PLUS_ONE_2 3
#define PLUS_ONE_3 4
#define PLUS_ONE_4 5
#define PLUS_ONE_5 6
#define PLUS_ONE_7 8
#define PLUS_ONE_8 9
#define PLUS_ONE_9 10
// and so on...
你不能只用PLUS_ONE(x)
在串联操作,因为预处理器将不会展开。 有一个办法,但是 - 你可以滥用预处理器扩展可变参数的事实。
// pass to variadic macro to expand an argument
#define PRINTME(indexNum) PRINTME_PRIMITIVE(PLUS_ONE(indexNum))
// do concatenation
#define PRINTME_PRIMITIVE(...) class m_ ## __VA_ARGS__ { }
完成!
PRINTME(1); // expands to class m_2 { };
您是否使用模板,而不是考虑?