问题如何使用宏在 C++ 中生成随机变量名称中演示了一种创建随机(实际上是按顺序编号的)变量名称的方法?.
但是,没有解释以后如何访问这种生成的名称。想象一个带有构造函数的类声明。您需要为类名和 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 违规)。我不能在不显着改变使用模式的情况下改变这种方法。
由于没有其他人想从评论中发布答案。(这里的例子)
问题是这违反了 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;
};
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句