複数のファイルに #include する名前空間に関数を含める正しい方法ですか?
test.h
#pragma once
#ifndef TEST
#define TEST
namespace test{
namespace {
bool test(){
return true;
}
}
}
#endif //TEST
複数のファイルに #include する名前空間に関数を含める正しい方法ですか?
test.h
#pragma once
#ifndef TEST
#define TEST
namespace test{
namespace {
bool test(){
return true;
}
}
}
#endif //TEST
インクルード ガード名TEST
は、他のマクロと競合する可能性がありHEADERNAME_H
ます。
注: アンダースコアの後に大文字が続く名前、および 2 つの連続するアンダースコアを含む名前は、実装用に予約されています。
次に、それをヘッダー ファイルに入れる場合は、関数定義をinline
. それ以外の場合、複数の翻訳単位に含まれていると、複数定義リンカー エラーが発生します。より正式には、標準の ODR (One Definition Rule) は、それらがすべてinline
実質的に同一でない限り、そのような複数の定義を禁止しています。
編集:匿名の名前空間の使用が見られなかったため、上記を削除してください。
匿名の名前空間の代わりに、各翻訳単位に個別の名前空間を提供し、そのような名前空間ごとに個別の (同一の) 関数定義を提供します。これは、inline
上記の取り消し線のテキストで説明されているように、使用するだけではありません。
乾杯 & hth.,
匿名の名前空間は、ラップするすべての識別子を、それらが含まれる翻訳単位に固有のものにします。匿名の名前空間を、(遅かれ早かれ) 異なる翻訳単位に含まれるヘッダーに配置すると、その匿名の名前空間で定義されたすべての識別子が別々になることになります。 (ただし同じように) 各翻訳単位で.
これが必要なユースケースはまだ見ていません。
はい。同じものに同じ名前を付けて、この名前をシンプルに保つことができるからです。