4

複数のファイルに #include する名前空間に関数を含める正しい方法ですか?

test.h

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

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

3 に答える 3

8

インクルード ガード名TESTは、他のマクロと競合する可能性がありHEADERNAME_Hます。

注: アンダースコアの後に大文字が続く名前、および 2 つの連続するアンダースコアを含む名前は、実装用に予約されています。

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

編集:匿名の名前空間の使用が見られなかったため、上記を削除してください。

匿名の名前空間の代わりに、各翻訳単位に個別の名前空間を提供し、そのような名前空間ごとに個別の (同一の) 関数定義を提供します。これは、inline上記の取り消し線のテキストで説明されているように、使用するだけではありません。

乾杯 & hth.,

于 2011-01-28T11:23:02.963 に答える
2

匿名の名前空間は、ラップするすべての識別子を、それらが含まれる翻訳単位に固有のものにします。匿名の名前空間を、(遅かれ早かれ) 異なる翻訳単位に含まれるヘッダーに配置すると、その匿名の名前空間で定義されたすべての識別子が別々になることになります。 (ただし同じように) 各翻訳単位で.

これが必要なユースケースはまだ見ていません。

于 2011-01-28T13:22:06.553 に答える
0

はい。同じものに同じ名前を付けて、この名前をシンプルに保つことができるからです。

于 2011-01-28T11:21:12.627 に答える