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 引用?