私のプロジェクトは2つのソースファイルのみで構成されています。
a.cpp:
const int n = 8;
b.cpp:
extern const int n;
int main()
{
// error LNK2001: unresolved external symbol "int const n" (?n@@3HB)
int m = n;
}
私はそれを機能させるためのいくつかの方法があることを知っています。しかし、なぜそれが機能しないのだろうか?
私のプロジェクトは2つのソースファイルのみで構成されています。
a.cpp:
const int n = 8;
b.cpp:
extern const int n;
int main()
{
// error LNK2001: unresolved external symbol "int const n" (?n@@3HB)
int m = n;
}
私はそれを機能させるためのいくつかの方法があることを知っています。しかし、なぜそれが機能しないのだろうか?
これconstは、デフォルトで内部リンケージを意味するため、「定義」は、それが表示される翻訳単位の外部には表示されません。
この場合、最善の解決策は、宣言(extern int const n;)をヘッダーファイルに入れ、それをとの両方にインクルードすることa.cppですb.cpp。リンケージは、コンパイラーが最初に認識する宣言によって決定されるため、の後半の定義に
a.cppは正しい(外部)リンケージがあります。
または、定義でリンクを強制することもできます。
extern int const n = 8;
にもかかわらずextern、これはまだ定義です。クラス定義の外にイニシャライザーがあるものはすべて定義です。
constまた、C ++の変数は、(定義または前の宣言のいずれかで)constexpr宣言されていない場合、内部リンクを持っています(したがって、他のコンパイル単位ではアクセスできません)。extern
Cの場合はそうではないので(Cはそうではありませんconstexpr)、コードは有効であり、さらに多くexternの定義を追加できます。
したがって、CとC ++の両方であるコードを記述したい場合(そして、2つの宣言はおそらくJamesが指摘したのと同じヘッダーから来るはずです):
// a.cpp
extern const int n;
const int n = 8;
// b.cpp
extern const int n;
int main()
{
int m = n;
}
そうしない場合
// a.cpp
extern const int n = 8;
可能です
a.cppでexternを宣言し、b.cppでexternなしで使用します。
ああ
extern const int n ;
a.cpp
#include "a.h"
...
const int n= 8
b.cpp:
#include "a.h"
...
int main()
{
int m = n;
}
To share a const object among multiple files, you must define the variable as extern.
To define a single instance of a const variable, we use the keyword extern on both its definition and declaration(s):
externこれらのルールから、定義にキーワードを追加する必要があります。あなたはすでにそれを宣言に持っています。
ここでの他の答えがうまくいかない場合は、異なる名前空間に定義がある可能性があります...コンパイルが成功し、undefined symbolリンカーエラーが発生した場合:
extern const int nこれが宣言の効果的な名前空間です 。const int n = 8それが定義を行う効果的な名前空間であることを確認してください。