重复的类实例化而不使用标识符

时间:2014-09-25 23:58:18

标签: c++ unique anonymous

我想在模块范围内重复实例化一个类,而不提供唯一的名称。这样的事情。

MyClass name##__LINE__(); // doesn't work because __LINE__ won't stringify
MyClass name##__LINE__(); // duplicate identifier error - two name__LINE__ variables

有没有办法做到这一点,要么创建一个唯一的名称,要么使用一些匿名上下文,如初始化程序或结构?

2 个答案:

答案 0 :(得分:1)

请参阅this answer

#define CONCATENATE_DETAIL(x, y) x##y
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
#define MAKE_UNIQUE(x) CONCATENATE(x, __LINE__)

MyClass MAKE_UNIQUE(name);
MyClass MAKE_UNIQUE(name);
...

或者只是制作一个数组:

MyClass arr[N];

为什么这些宏有效
C11标准,6.10.3.1 Argument substitution

  

在确定了调用类函数宏的参数之后,   参数替换发生。替换列表中的参数,除非在前面   通过###预处理令牌或后跟##预处理令牌(见下文),   在其中包含的所有宏之后用相应的参数替换   扩大。在被替换之前,每个参数的预处理标记都是   完全宏被替换,好像它们形成了预处理文件的其余部分;没有其他   预处理令牌可用。

C ++标准中的相应段落(16.3.1 Argument substitution)是C标准的精确副本。

答案 1 :(得分:0)

您需要对连接运算符进行双重嵌套

struct A{};

#define JOIN(X, Y) JOIN_DETAIL(X, Y)
#define JOIN_DETAIL(X, Y) JOIN_DETAIL2(X, Y)
#define JOIN_DETAIL2(X, Y) X##Y

int main() {
    A JOIN(a, __LINE__);
    A JOIN(a, __LINE__);
}