const std::string 具有内部链接,但似乎不适用于 const std::string&

const std::string have internal linkage but it seems same is not applicable for const std::string&

我有一个头文件,我在其中声明如下变量:

//Constants.h
const std::string& binaryName = "ApplicationGateway";
const std::string& binaryMode = "Maintenance";

然而,当我将此文件包含在多个 cpp 文件中时,说 first.cpp 和 second.cpp 我得到多个定义错误,我找不到相同的原因,因为我的理解是 const 变量具有内部链接.

所以我的问题是 const 引用是否没有内部链接,如果没有,我们如何在需要包含在多个 cpp 文件中的头文件中包含 const 引用。

您应该在 Constants.cpp 中定义它们并在 header 中将它们标记为外部:

//Constants.cpp
const std::string& binaryName = "ApplicationGateway";
const std::string& binaryMode = "Maintenance";

//Constants.h
extern const std::string& binaryName;
extern const std::string& binaryMode;

将 header 文件视为被复制并粘贴到包含所述 header 文件的任何地方。这就是编译器认为您一遍又一遍地声明变量的原因,因为对于编译器而言,变量实际上是。这个(尽管设计很糟糕)的一个怪癖是,如果你要将它保留在你的 header 中,但只在任何地方包含它一次,那么你的代码应该可以正常编译。

my understanding is const variable

这不是 const 变量,尽管 const 确实出现了:const 没有出现在顶层。

So my question is does const reference don't have internal linkage,

如果需要内部链接,可以明确指定:

static const std::string& binaryName = "ApplicationGateway";
static const std::string& binaryMode = "Maintenance";

如果您不需要内部链接,从 C++17 开始,您可以将这些定义为 inline 变量:

inline const std::string& binaryName = "ApplicationGateway";
inline const std::string& binaryMode = "Maintenance";

inline函数一样,它们允许在多个翻译单元中定义,并且您将获得相同的字符串对象。