2013-02-15 9 views
22

私のプロジェクトは2つだけのソースファイルで構成されていますなぜ "extern const int n;"期待どおりに動作しない?

a.cpp:

const int n = 8; 

b.cpp:私はそれを動作させるには、いくつかの方法があります知っている

extern const int n; 

int main() 
{ 
    // error LNK2001: unresolved external symbol "int const n" ([email protected]@3HB) 
    int m = n; 
} 

。しかし、私はそれがうまくいかない理由は不思議です。

+7

'a.cpp'を' extern const int n = 8;に変更してみてください。 'AFAIK' const'は 'static'を暗示しています。 – Pubby

+0

a.cppはexternキーワードでnの格言を見る必要がありますか? –

+0

あなたはリンクしているものを教えてくれませんでした... – PlasmaHH

答えて

39

constはデフォルトで内部リンケージを意味するため、 "定義"は翻訳単位 の外側には表示されません。この場合

は、はるかに最善の解決策は、ヘッダーファイルに宣言 (extern int const n;)を挿入することであり、 a.cppb.cpp両方でいることが挙げられます。リンケージは、コンパイラが最初に宣言した によって決定されるため、 a.cppの後の定義には正しい(外部の)リンケージがあります。

また、あなたが定義でリンケージを強制することができます。

extern int const n = 8; 

externにもかかわらず、これはまだ定義です。 のクラス定義外の初期化子は定義です。内部結合を有するC++で

2

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; 
} 
+0

ええ、ヘッダーファイルでこれを行うのに使われました。 externでヘッダーを含めるのが最も簡単な方法です。 – Gjordis

+1

実際には、b.cppから 'const int n;'を削除する必要があります。インクルードヘッダーが必要です。 – Roddy

+0

@Roddy Correct、それに応じて修正されました。 – Gjordis

5

constconstexpr変数彼らはまた、(定義または前宣言のいずれか)externと宣言されていない場合(したがって、他のコンパイル単位にアクセスできません)。

Cでは、コードは有効ですので、を定義に入れることができます(よくCはconstexprではありません)。だから、

あなたがCやC++(とジェームズが指摘したように2つの宣言は、おそらく同じヘッダから来る必要があります)の両方でコード書きたい場合は:あなたがいない

をすれば

// 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; 

も可能である

+0

@Roddy、fixed。コメントするのではなく、あなた自身のようなものを自分で修正するのをためらってください。 – AProgrammer

1

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キーワードを追加するだけです。あなたはすでにそれを宣言しています。

1

トリックをしない、ここで他の回答した場合、コンパイルが通過すれば、それは...あなたは別の名前空間であなたの定義を持っている場合であってもよく、あなたがundefined symbolリンカエラーを取得:

  • 未定義シンボルの名前空間をチェックする。これはextern const int n宣言の有効な名前空間です。
  • const int n = 8の定義を行う有効な名前空間であることを確認してください。
関連する問題