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

时间:2018-05-02 09:18:32

标签: c++ linkage

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

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

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

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

2 个答案:

答案 0 :(得分:4)

您应该在Constants.cpp中定义它们并在标题中将它们标记为extern:

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

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

将头文件视为被复制并粘贴到包含所述头文件的任何位置。这就是编译器认为你一遍又一遍地声明变量的原因,因为编译器实际上是变量。这个(虽然可怕的设计)的一个怪癖是,如果你要将它保留在标题中,但只将它包含在任何地方,那么你的代码应该编译得很好。

答案 1 :(得分:3)

  

我的理解是const变量

这不是const变量,即使出现constconst也未显示在顶层。

  

所以我的问题是const引用没有内部链接,

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

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函数一样,允许在多个翻译单元中定义这些函数,并且您将获得相同的字符串对象。