我想在模块范围内重复实例化一个类,而不提供唯一的名称。这样的事情。
MyClass name##__LINE__(); // doesn't work because __LINE__ won't stringify
MyClass name##__LINE__(); // duplicate identifier error - two name__LINE__ variables
有没有办法做到这一点,要么创建一个唯一的名称,要么使用一些匿名上下文,如初始化程序或结构?
答案 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__);
}