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



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

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

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数据的最佳方法是什么?

基于评论,我怀疑您想要一些东西:

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, "");

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新