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

时间:2019-04-02 11:23:20

标签: c++

问题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)。在不大幅度改变使用方式的情况下,我无法更改这种方法。

1 个答案:

答案 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;
};
}