私は新しい C++ ソフトウェア プロジェクトに参加したばかりで、その設計を理解しようとしています。プロジェクトでは、名前のない名前空間が頻繁に使用されます。たとえば、クラス定義ファイルでは次のようなことが起こる可能性があります。
// newusertype.cc
namespace {
const int SIZE_OF_ARRAY_X;
const int SIZE_OF_ARRAY_Y;
bool getState(userType*,otherUserType*);
}
newusertype::newusertype(...) {...
名前のない名前空間を使用する理由となる設計上の考慮事項は何ですか? 利点と欠点は何ですか?
ベストアンサー1
名前のない名前空間は識別子を作成するためのユーティリティです翻訳ユニットローカル。名前空間の翻訳単位ごとに一意の名前を選択した場合と同じように動作します。
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
空の本体を使用する追加の手順は重要です。using::name
ディレクティブがすでに実行されているため、名前空間本体内でその名前空間で定義されているような識別子を参照できます。
これは、(たとえば)help
複数の翻訳単位に存在できるフリー関数を呼び出すことができ、リンク時に衝突しないことを意味します。効果は、static
識別子の宣言に挿入できる C で使用されるキーワードを使用するのとほぼ同じです。名前のない名前空間は、型翻訳単位をローカルにすることさえできる優れた代替手段です。
namespace { int a1; }
static int a2;
は両方ともa
翻訳単位ローカルであり、リンク時に衝突しません。ただし、a1
匿名名前空間の には一意の名前が付けられるという違いがあります。
comeau-computingで素晴らしい記事を読んでくださいなぜ静的ではなく名前のない名前空間が使用されるのですか?(Archive.orgミラー)。