1. ホーム
  2. c++

[解決済み】無名名前空間が使用される理由とその利点は何ですか?

2022-03-30 23:48:20

質問

私は新しいC++ソフトウェアプロジェクトに参加したばかりで、設計を理解しようとしています。 このプロジェクトでは、無名の名前空間が頻繁に使用されています。 例えば、クラス定義ファイルでは次のようなことが起こります。

// newusertype.cc
namespace {
  const int SIZE_OF_ARRAY_X;
  const int SIZE_OF_ARRAY_Y;
  bool getState(userType*,otherUserType*);
}

newusertype::newusertype(...) {...

無名名前空間を使用する設計上の注意点は何ですか? また、そのメリットとデメリットは何ですか?

どのように解決するのですか?

無名名前空間は、識別子を作るためのユーティリティです。 翻訳単位 ローカルになります。これは、名前空間に対して翻訳単位ごとに一意な名前を選択するのと同じように動作します。

namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }

空のボディを使用する余分なステップは重要で、名前空間のボディ内ですでに以下のような識別子を参照することができます。 ::name は、using ディレクティブがすでに実行されているので、その名前空間で定義されているものです。

つまり、(例えば)以下のような自由な関数を持つことができるのです。 help は、複数の翻訳ユニットに存在することができ、リンク時に衝突することはありません。この効果は static というC言語のキーワードを識別子の宣言に入れることができます。無名名前空間は、型変換単位をローカルにすることもできる優れた代替手段である。

namespace { int a1; }
static int a2;

両方 a は翻訳ユニットローカルであり、リンク時に衝突することはありません。しかし、異なるのは a1 の匿名名前空間には一意な名前が付けられます。

Comeau-computing の素晴らしい記事を読む。 なぜstaticではなくunnamedの名前空間が使われるのですか? ( Archive.orgのミラー ).