【问题标题】:const std::string have internal linkage but it seems same is not applicable for const std::string&const std::string 具有内部链接,但似乎同样不适用于 const std::string&
【发布时间】:2018-05-02 09:18:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 只是好奇 - 为什么要存储对未命名字符串对象的引用而不是存储字符串值?
  • bcoz 我的理解是字符串文字存储在只读内存段中,当我们按值存储时,它将被复制到该 const 字符串中,所以只想避免复制
  • 不幸的是,这段代码将首先创建一个副本,然后存储对该副本的引用。
  • 您能否提供更多细节以便更好地理解以及为什么在我们直接创建对字符串变量的引用时会首先创建副本
  • 不,它不会做额外的复制,字符串对象是就地创建的。这是一个旧答案(对一个完全不同的问题),显示how little code it actually takes to create a std::string

标签: c++ linkage


【解决方案1】:

您应该在 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;

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

【讨论】:

  • 你能不能也解释一下
  • @Kapil 我的错,你去吧。
【解决方案2】:

我的理解是 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 函数一样,这些函数可以在多个翻译单元中定义,并且您将得到相同的字符串对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 2020-06-26
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2010-10-22
    相关资源
    最近更新 更多