2009-09-10 139 views
2

我有在g ++上重现的问题。 VC++不会遇到任何问题。 所以我有2个cpp文件:g ++外部参考错误

1.cpp:

#include <string> 
#include <iostream> 

extern const std::string QWERTY; 

int main() 
{ 
    std::cout << QWERTY.c_str() << std::endl; 

} 

2.cpp:

#include <string> 
const std::string QWERTY("qwerty"); 

没有魔法,我只想地方字符串常量到分隔的文件。在链接时间ld产生一个错误:“未定义的引用'_QWERTY'” 第一个想到将两个声明都包装到“extern”C“” - 没有帮助。错误和非C++ _QWERTY仍然存在。

在此先感谢您的任何建议

回答

6

看起来你很可能遇到了此位的标准:

In C, a const-qualified object at file scope without an explicit storage class specifier has external linkage. In C++, it has internal linkage.

采取这项变更2.cpp:

#include <string> 
extern const std::string QWERTY("qwerty"); 

关于这个问题中的“连接”意味着更多的细节 - What is external linkage and internal linkage in C++

0

我得看看它,但我认为常量全局变量在C++中有内部链接,不要使用const,它会很好地编译。

1.cpp 

... 
extern std::string QWERTY; 
... 

2.cpp 
#include <string> 
std::string QWERTY("qwerty"); 

或者你可以声明/定义它作为一个常见的头字符串当然。

添加多余extern到2.cpp会得到它来编译过,但我不知道这是标准的或部分G ++“额外”

+0

不幸的是我必须确保值是不可变的。所以const是强制修饰符。 – Dewfy 2009-09-10 10:34:29