2012-04-05 17 views
1

誰かに助言してもらえますか?C++でのconstの内部リンケージ、まだ重複したシンボルがあります

C++のconstがデフォルトで内部リンケージの場合、以下のコードで複数の定義エラーが発生するのはなぜですか?

まず、ファイルdem.h

#ifndef _DEM_H_ 
    #define _DEM_H_ 
    class Dem { 
     public: 
      static const int i; 
    }; 

    const int Dem::i = 10; 
#endif 

ゼムimp1.cpp

#include "dem.h" 
#include <iostream> 

using namespace std; 
extern int foo(); 

int main() { 
     cout << foo() << endl; 
} 

imp2.cpp

#include "dem.h" 

int foo() { 
    return Dem::i ; 
} 

私は、次のコマンドの結果をコンパイルします。

をC++ 11 [basic.link]から
$ g++ imp1.cpp imp2.cpp 
/tmp/ccmGt0OY.o:imp2.cpp:(.rdata+0x0): multiple definition of `Dem::i' 
/tmp/cc5sN7dz.o:imp1.cpp:(.rdata+0x0): first defined here 
collect2: ld returned 1 exit status 

答えて

3

、段落5:また

、メンバ関数、静的データメンバー、Aで定義された名前のクラスまたは列挙クラススコープの、または名前のクラスまたは列挙クラスまたは列挙型がリンケージ目的のためのtypedef名を持つようなクラススコープtypedef宣言(7.1.3)は、クラスの名前が外部リンケージを持つ場合は外部リンケージを持ちます。

クラスに外部リンケージがあるため、静的データメンバーも同様です。

+0

ありがとうございますpaxdiablo !!今、私は分かる。 – Rajat

0

コンパイル単位に対して静的です。最初のimpl1.cppとimpl2.cppの2つのステップでコンパイルし、各ユニットでコンパイラが静的データメンバーをインスタンス化します。リンカは2つの関連するオブジェクトファイルをリンクさせようとすると、同じシンボルに対して2つの異なる定義が表示されるため、複数の定義エラーが発生します。

関連する問題