问题How to generate random variable names in C++ using macros?中展示了一种创建随机(实际上顺序编号)变量名的方法。
但是,没有说明以后如何访问生成的名称。想象一下带有构造函数的类声明。类名称和c-tor需要相同的随机名称。始终使用生成器宏只会生成一个新的标识符,并且编译将失败。这是一个示例:
#define CONCAT_(x,y) x##y
#define CONCAT(x, y) CONCAT_(x, y)
#define DESCRIBE_IMPL CONCAT(DescribeImpl, __COUNTER__)
class DESCRIBE_IMPL {
public:
DESCRIBE_IMPL() {}
};
我尝试以某种方式存储当前计数器值(例如enum { COUNTER = __COUNTER__ }
,但使用此枚举始终会导致名称为DescribeImplCOUNTER
,而不是带有计数器值的变量。
我要用这种方法解决的情况是,我在不同的cpp文件(从宏生成)中具有同一类的多个定义,并且链接程序抱怨多个符号(违反了ODR)。在不大幅度改变使用方式的情况下,我无法更改这种方法。
答案 0 :(得分:0)
由于没有其他人希望从评论中发布答案。 (来自here的示例)
问题在于这违反了ODR:
// a.cpp
struct S {
int a;
};
// b.cpp
class S {
public:
int a;
};
一种解决方案是将定义放入每个文件的匿名名称空间中,以防止链接程序尝试将名称与另一个翻译单元重新协调。
// a.cpp
namespace {
struct S {
int a;
};
}
// b.cpp
namespace {
class S {
public:
int a;
};
}