2016-11-09 15 views
1

ヘッダファイルglobal.hにグローバル名前空間を定義しようとしています。他の.cppファイル内ヘッダファイルに名前空間を使用するときの多重定義

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 
} 
... 

ときJUSTは#include "global.h"私は例えば、他の.cppファイルにg_0g_1を使用しようとすると、コンパイラはエラーに

multiple definition of g::g_0 
multiple definition of g::g_1 

を与えます。何か特別なグローバル変数を宣言するために、名前空間を使用して

ISO C++ forbids in-class initialization of non-const static member... 

あります:

int g_0_copy = g::g_0; 
int g_1_copy = g::g_1; 

それはというエラーがスローされますか? (この場合はC++ 98を使用する必要があります)

+0

名前空間が同じコンパイルユニットに2回含まれていると、コンパイラはエラーを発行します。さもなければ、定数は静的なリンケージを持つ。 –

+1

愚かな質問です。あなたはヘッダーにガードを含んでいますか? – StoryTeller

+1

フルコードが必要です。 「クラス内初期化」に関する注釈は、あなたが私たちに示す以上のものがあることを私に伝えます。 – SergeyA

答えて

2

すべてのグローバルがconstの場合は、ガードを含める必要があります。

#ifndef GLOBAL_H 
#define GLOBAL_H 

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 
} 
... 

#endif // GLOBAL_H 

const global variables have internal linkage unless explicitly declared extern

、彼らは唯一の翻訳単位ごとに一度定義されているとして、彼らは限りリンクエラーが発生することはありませんので。各翻訳単位には、各グローバル定数の独自のコピーがあります。コンパイラは、可能であれば最適化することも、最適化しないこともできます。


一部のグローバルがconstではない場合は、少し複雑になります。

#ifndef GLOBAL_H 
#define GLOBAL_H 

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 

    int g_2 = 2; // Oh, boy. 
} 
... 

#endif // GLOBAL_H 

この変数は、デフォルトで外部リンケージを持っているとして、それが原因g_2という名前の別の変数を含む複数の翻訳単位にリンクエラーが発生します。ここでの解決策は、ヘッダーに変数externを宣言し、その実際の定義をソースファイルに配置することです。

ISO C++ forbids in-class initialization of non-const static member... 

私は何を知らなくても、このことについて何も言うことはできません。SergeyAin the commentsを指摘したように、あなたが得たエラーメッセージがこれによりがあることを示している、と述べた

// global.h 
#ifndef GLOBAL_H 
#define GLOBAL_H 

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 

    extern int g_2; // Oh, boy. 
} 
... 

#endif // GLOBAL_H 

// --- 

// global.cpp 
namespace g { 
    int g_2 = 2; 
} 

コードがそれを引き起こしています。

関連する問題