我有一个头文件,我在这里声明如下变量:
//Constants.h
const std::string& binaryName = "ApplicationGateway";
const std::string& binaryMode = "Maintenance";
然而,当我在多个cpp文件中包含此文件时,请说first.cpp和second.cpp我得到多个定义错误,我找不到相同的推理因为我的理解是const变量有内部链接。
所以我的问题是const引用没有内部链接,如果不是我们如何在头文件中有需要包含在多个cpp文件中的const引用。
答案 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
变量,即使出现const
:const
也未显示在顶层。
所以我的问题是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
函数一样,允许在多个翻译单元中定义这些函数,并且您将获得相同的字符串对象。