C++ constexpr 引用多重定义

Posted

技术标签:

【中文标题】C++ constexpr 引用多重定义【英文标题】:C++ constexpr reference multiple definition 【发布时间】:2017-06-07 03:18:09 【问题描述】:

我正在尝试使用指向外部定义对象的 constexpr 引用指针。

hardware.h

extern int crypticName;

hardware.cpp

#include "hardware.h"
int crypticName;

shared.h

#include "hardware.h"
constexpr int& usefulName = crypticName; // This is the reference I'm interested in

main.cpp

#include "shared.h"
int main() return 0;

other.cpp

#include "shared.h"

GCC 使用的语法似乎没有问题。但是,当链接器尝试将所有内容组合在一起时,我遇到了multiple definition 问题。

.bld/other.cpp.o:(.rodata.usefulName+0x0): multiple definition of `usefulName'
.bld/main.cpp.o:(.rodata.usefulName+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

我猜编译器正在猜测(或使用一些占位符)每个编译单元中crypticName 的某个位置,并且丢失了通常处理这些问题的extern 链接。所以也许这是预期的行为。

我缺少一些简单的东西吗?还是我需要改变我抽象硬件的方式?

“解决”这个问题的一种方法是使用constexpr int * const usefulName = crypticName 而不是引用分配。但是,我宁愿不需要一直取消引用usefulName。毕竟,在我的用例中,这种抽象的一个要点是隐藏指针的东西。

值得注意的是,this SO question 可能是一样的。

【问题讨论】:

您显然对usefulName 有两个定义(一个在main 单元中,一个在other 单元中) 同意它与您链接的问题相同,尽管也没有答案 【参考方案1】:

您可以将usefulName 明确声明为static 以强制它具有内部链接:

static constexpr int& usefulName = crypticName;

我不确定为什么默认情况下它不是静态的,因为它是 constexpr,但明确声明它 static 似乎可以解决问题。

【讨论】:

我想如果编译器给它外部链接,那将是一个编译器错误; [basic.link] 看起来很清晰

以上是关于C++ constexpr 引用多重定义的主要内容,如果未能解决你的问题,请参考以下文章

如何编写工厂函数来初始化 C++ 中的 constexpr 引用?

如何使用 hystrix 定义重试次数

C ++:constexpr对变量暗示隐式const不适用于引用[重复]

C++中 const和constexpr的区别

C++中 const和constexpr的区别

c++ 默认构造函数 constexpr 还是正确未定义?