我正在尝试使用指向外部定义对象的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可能是相同的。
答案 0 :(得分:0)
您可以明确声明usefulName
为static
以强制它具有内部链接:
static constexpr int& usefulName = crypticName;
我不确定为什么默认情况下它不是静态的,因为它是constexpr
,但明确声明它static
似乎可以解决问题。