How do I define string constants in C++?
Possible Duplicate:
C++ static constant string (class member)
static const C++ class member initialized gives a duplicate symbol error when linking
我的C++经验是预先添加了字符串类,所以我从某些方面开始。
我正在为类定义头文件,并希望为URL创建一个静态常量。我尝试这样做,方法如下:
1 2 3 4 5 6 7
| #include <string>
class MainController{
private:
static const std::string SOME_URL;
}
const std::string MainController::SOME_URL ="www.google.com"; |
但这在链接期间给了我一个重复的定义。
我怎样才能做到这一点?
- dup stackoverflow.com/questions/2888805/&hellip;
移动
1
| const std::string MainController::SOME_URL ="www.google.com"; |
到cpp文件。如果您将它放在一个头中,那么包含它的每个.cpp都将有一个副本,并且您将在链接期间得到重复符号错误。
- 我想我不太明白的是我的头罩里有这些。这解决了问题,我只是不明白为什么…
- @thom,由于每个翻译单元(cpp文件)都包含头部,所以每个翻译单元以相同名称的字符串的"副本"结束,所以问题没有通过头部保护解决,结果是每个翻译单元都正确编译。但是,当链接多个翻译单元时,具有相同的符号(字符串),这会由于符号链接而导致链接错误。
你得排队
1
| const std::string MainController::SOME_URL ="www.google.com"; |
在cpp文件中,不是头,因为有一个定义规则。您不能在类中直接初始化它,这是因为std::string不是整型(如int)。
或者,根据您的用例,您可以考虑不创建静态成员,而是使用匿名名称空间。有关赞成/反对的信息,请参阅本帖。
- 即使是整型,也会产生误差。也就是说,它与静态成员的类型无关;只要在头中提供成员的定义,它就会给出错误。
- @纳瓦兹在实践中。形式上,不同翻译单元中的多个定义是未定义的行为,因此编译器可以使其工作。(或者做其他任何事情,但是"使它工作"是C中的一个常见实现,构造函数没有进入其中。)
- @你想说什么?它与静态成员的类型有关吗?
- @纳瓦兹:关于整型的部分,我指的是在头中的类体中提供一个常量初始值设定项,如:class A { static const int OBVIOUS = 1;}所示。
- @JRL:但这不是OP正在做的。你把两样东西混在一起了。
- @纳瓦兹:我知道这不是手术室要做的。OP提到他在C++中生疏了。我只是在添加一些关于如何初始化字符串的信息(把它放在cpp中),如果它是int,它可以直接在类体中初始化,并且在某些情况下匿名名称空间可能有用。
- @JRL:你现在的回答没有在评论中说你在说什么。在您的答案中,您甚至没有讨论类内初始化(这只允许用于整型)。
- @纳瓦兹,它与类型无关。单独翻译单元中的多个定义是未定义的行为,允许编译器使其工作。传统上,C编译器(由于历史原因),C++编译器没有。可能因为旧链接器,当有动态初始化时很难使它工作。在实践中,用C++编译器,你会得到一个错误。
- @詹姆斯坎兹:哦,我明白了。起初我以为你同意JRL,暗示它与成员的类型有关。在阅读了你的评论之后,我应该把我的第一条评论改成:在实践中,即使它是整型的,它也会产生错误。也就是说,它与静态成员的类型无关;只要在头中提供成员的定义,它就会给出错误(实际上)。
- @纳瓦兹:我澄清了这篇文章。享受!;-)
- @JRL:删除了-1。然后上票。+ 1。享受!;-)
- 纳瓦兹,我并不是想说你错了,不管是出于意图还是目的,今天在C++中,你是对的。我只是提供了一些额外的信息:历史和标准,但没有什么可以改变您所写内容的影响。
- @詹姆斯坎兹:我必须感谢你在评论中提供的信息。老实说,我不知道。谢谢。-)
在头文件中定义类:
1 2 3 4 5
| //file.h
class MainController{
private:
static const std::string SOME_URL;
} |
然后,在源文件中:
1 2 3 4
| //file.cpp
#include"file.h"
const std::string MainController::SOME_URL ="www.google.com"; |
您应该将const std::string MainController::SOME_URL ="www.google.com";定义放入单个源文件中,而不是头文件中。