C ++ constexpr引用多个定义

时间:2017-06-07 03:18:10

标签: c++ c++11 constexpr

我正在尝试使用指向外部定义对象的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可能是相同的。

1 个答案:

答案 0 :(得分:0)

您可以明确声明usefulNamestatic以强制它具有内部链接:

static constexpr int& usefulName = crypticName;

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