2

g++で再現される問題があります。VC++は問題を満たしていません。だから私は2つのcppファイルを持っています:

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はまだあります。

提案を事前に感謝します

4

2 に答える 2

6

おそらく、この標準のビットに遭遇しているようです:

C では、明示的なストレージ クラス指定子を持たないファイル スコープの const 修飾オブジェクトには、外部リンケージがあります。 C++ では、内部リンケージがあります。

2.cpp に次の変更を加えます。

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

この質問で「リンケージ」が何を意味するかについての詳細があります - What is external LinkedIn and internal LinkedIn in C++ .

于 2009-09-10T10:20:19.123 に答える
0

私はそれを調べる必要がありますが、const グローバル変数には C++ の内部リンケージがあると思います。使用しないでくださいconst。コンパイルは正常に行われます。

1.cpp

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

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

もちろん、共通ヘッダーで const 文字列として宣言/定義することもできます。

extern余分なものを 2.cpp に追加すると、それもコンパイルされますが、それが標準であるか、いくつかの g++ 'extra' であるかはわかりません

于 2009-09-10T10:21:04.877 に答える