私のプロジェクトは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
にもかかわらず、これはまだ定義です。クラス定義の外に初期化子があるものはすべて定義です。
C++のconst
変数と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;
も可能です
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
キーワードを追加するだけです。あなたはすでに宣言にそれを持っています。
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;
}
ここでの他の回答でうまくいかない場合は、定義が別の名前空間にある可能性があります...コンパイルが成功し、undefined symbol
リンカーエラーが発生する場合:
extern const int n
宣言の有効な名前空間です。const int n = 8
定義を作成する有効な名前空間であることを確認してください。