3

C++ オブジェクトで extern を使用しようとすると、未定義の参照エラーが発生します。整数型では発生しないようです。何が足りないの?! 以下のコードは問題を再現します。

file1.cpp:

#include <string>

const std::string s("test");
int i = 99;

int main()
{
        extern void Test();
        Test();
}

file2.cpp:

#include <iostream>
#include <string>

extern const std::string s;
extern int i;

void Test()
{
        std::cout << s << std::endl;
        std::cout << i << std::endl;
}

's' std::string 変数の使用法をコメント アウトすると、リンク エラーがなくなります。

これに似たSOに関する他の質問がありますが、それらはすべて変数を定義していない人々に関連しているようです。

4

2 に答える 2

4

それはconstオンstd::stringです、それはs内部リンクを与えます。[3.5プログラムとリンケージ]からの引用:3:

名前空間スコープ(3.3.6)を持つ名前は、

constまたはconstexprとして明示的に宣言されており、externとして明示的に宣言されておらず、外部リンケージを持つように以前に宣言されていない変数。また

于 2012-10-03T02:53:02.787 に答える
2

const を削除すると vc++ で動作し、両方とも extern const を定義すると動作します。

// file1.cpp
extern const std::string s("test");
extern const int i = 99;

// file2.cpp
extern const std::string s;
extern const int i;

file1.cpp から「extern」を削除すると、コンパイルできません。変数が const として定義されている場合は、file1.cpp から「extern」を削除できます。

于 2012-10-03T02:37:27.243 に答える