如何生成随机变量或类名并稍后使用?

迈克·利施克

问题如何使用宏在 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章