【问题标题】:How do I define string constants in C++? [duplicate]如何在 C++ 中定义字符串常量? [复制]
【发布时间】:2011-11-26 03:25:26
【问题描述】:

可能重复:
C++ static constant string (class member)
static const C++ class member initialized gives a duplicate symbol error when linking

我在 C++ 方面的经验早于字符串类的添加,所以我在某些方面重新开始。

我正在为我的类定义我的头文件,并想为一个 url 创建一个静态常量。我正在尝试这样做:

#include <string>
class MainController{
private:
    static const std::string SOME_URL;
}

const std::string MainController::SOME_URL = "www.google.com";

但这在链接期间给了我一个重复的定义。

我怎样才能做到这一点?

【问题讨论】:

标签: c++ class definition


【解决方案1】:

移动

const std::string MainController::SOME_URL = "www.google.com";

到一个 cpp 文件。如果您将它放在标头中,则包含它的每个 .cpp 都会有一个副本,并且您将在链接期间收到重复符号错误。

【讨论】:

  • 我想我不太明白的是,我的头部防护装置中有这些。这解决了问题,我只是不明白为什么......
  • @Thom,标题保护没有解决这个问题,因为每个翻译单元(cpp 文件)都包含标题,所以每个翻译单元最终都有一个同名字符串的“副本”,结果是每个翻译单元都正确编译。但是,当链接多个翻译单元具有相同的符号(字符串)并且由于符号链接而引发链接错误时。
【解决方案2】:

你需要放行

const std::string MainController::SOME_URL = "www.google.com";

在 cpp 文件中,而不是标题中,因为 one-definition rule。而不能直接在类中初始化是因为std::string不是整数类型(比如int)。

或者,根据您的用例,您可能会考虑不创建静态成员,而是使用匿名命名空间。 See this post for pro/cons.

【讨论】:

  • @Nawaz 在实践中。形式上,不同翻译单元中的多个定义是未定义的行为,因此编译器可以使其工作。 (或者做任何其他事情,但“让它工作”是 C 中的一个常见实现。构造函数没有进入它。)
  • @JamesKanze:你想说什么?它与静态成员的type有关吗?
  • @Nawaz:我知道这不是 OP 正在做的事情。 OP提到他对C++很生疏。我只是添加一些关于如何初始化字符串(将其放入 cpp)的信息,如果它是 int,则可以直接在类主体中初始化,并且匿名命名空间在某些情况下可能有用。
  • @Nawaz 与类型无关。单独翻译单元中的多个定义是未定义的行为,并且允许编译器使其工作。传统上,C 编译器会这样做(出于历史原因); C++ 编译器没有。可能是因为使用较旧的链接器,在动态初始化时很难使其工作。在实践中,使用 C++ 编译器会出错。
  • @Nawaz 我不是想说你错了;对于所有意图和目的,今天在 C++ 中,你是对的。我只是提供了一些额外的信息:历史和标准,但没有改变你所写内容的影响。
【解决方案3】:

在头文件中定义类:

//file.h
class MainController{
private:
    static const std::string SOME_URL;
}

然后,在源文件中:

//file.cpp
 #include "file.h"

const std::string MainController::SOME_URL = "www.google.com";

【讨论】:

    【解决方案4】:

    您应该将const std::string MainController::SOME_URL = "www.google.com"; 定义放入单个源文件中,而不是在标题中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2022-12-12
      • 2011-07-02
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多