使用C ++ constexpr可以创建符号重复吗?

时间:2016-12-16 15:58:43

标签: c++ c++11 gcc one-definition-rule

我正在尝试定义一些字符串文字和一些常量结构。

做了一些测试我意识到使用:

constexpr char* name = "name";
constexpr Structure data = {1, 2, 3};

编译不同的库时,我必须在内存中创建名称和数据的地址,每个库都有所不同。 我真的不想发生这种情况。

我做了另一个测试:

constexpr char* name() { return "name"; }
constexpr Structure data() { return Structure{1, 2, 3}; };

以这种方式编译不同的库时,我发现(至少对于GCC)内存中名称和数据的地址总是相同的! 即使理论上复制了“数据”。

我尝试研究这种行为,但我无法确定此行为是否特定于GCC,或者符号的重用是否符合C ++标准。

被修改 确保constexpr数据不会在使用它的所有库中重复的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

根据评论,我怀疑你会想要这样的东西:

struct Structure { int x, y, z; };
static constexpr char const* _name = "name";
static constexpr Structure _data = { 1, 2, 3 };

constexpr char const* get_name() noexcept { return _name; }
constexpr Structure const& get_data() noexcept { return _data; }

然后其他翻译单元将具有类似于以下内容的代码:

constexpr char const* n = get_name();
constexpr Structure const& d = get_data();

printf("n: %s", n);
printf("d: %d %d %d", d.x, d.y, d.z);

如果该TU具有变量的范围,则可以静态断言

static_assert(_name == n, "");
static_assert(&_data == &d, "");

希望这有帮助。