2011-01-28 20 views
4

複数のファイルに#includeする関数を名前空間に持つのは正しい方法ですか?複数定義と名前空間

TEST.H

#pragma once 
    #ifndef TEST 
    #define TEST 
    namespace test{ 
    namespace { 

     bool test(){ 
      return true; 
     } 
    } 
} 
#endif //TEST 

答えて

8

インクルードガード名TESTは、他のマクロと競合する可能性があります。HEADERNAME_Hのようなもっと精巧なものを使用してください。

注:アンダースコアで始まり、大文字で始まり、2つの連続したアンダースコアを含む名前は、実装のために予約されています。

第2に、ヘッダーファイルに入れる場合は、関数定義をinlineにする必要があります。それ以外の場合は、複数の翻訳単位に含まれていると、複数定義のリンカーエラーが発生します。あるいは、形式的には、標準のODR(One Definition Rule)は、すべてがinlineであり、事実上同一でない限り、そのような複数の定義を禁止します。

編集:私は匿名の名前空間の使用を見ていないので、上記の削除。

匿名の名前空間の代わりに、各翻訳単位で別々の名前空間とそのような名前空間内の別々の(同一の)関数定義を使用する代わりに、上記のstrik-outテキストで説明したinline –を使用してください。

乾杯& HTH。、

+0

アドバイスありがとうございます – Stals

0

はい。同じ名前の同じものに名前を付けてこの名前を単純にすることができるからです。

2

匿名の名前空間は、彼らがしている翻訳単位に固有のを包むすべての識別子を作る。意志(遅かれ早かれが)に含まれるヘッダに匿名の名前空間を置きます異なる翻訳単位を使用すると、その匿名名前空間で定義されたすべての識別子は、それぞれの翻訳単位で別々に(ただし全く同じに)になります。

私はまだこれを望むユースケースを見ていません。

関連する問題