宏增加值,然后串联(Macro increase value and then concatenat

2019-10-17 02:44发布

我想创建一个递归的宏将创建“下一步”类。

例:

#define PRINTME(indexNum) class m_##(indexNum+1) { }

所述indexNum + 1被评价为int ,并且不会级联到的类名。

我怎样才能使编译器评估的是,在连接前?

Answer 1:

简单的答案是,你不能。 预处理一般成交在文本和标记; 唯一的地方算术中进行#if#elif的指令。

此外,宏扩展不是递归。 在膨胀期间,被扩展宏被禁用,并且不适用于进一步取代。



Answer 2:

如果你想生成唯一的类名每次时间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__有效。)

演示 。



Answer 3:

那么它是可行的,根据你的动机和忍受丑陋的代码的能力。 首先定义增量宏:

#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 { };

您是否使用模板,而不是考虑?



文章来源: Macro increase value and then concatenate