[解決済み】無名名前空間が使用される理由とその利点は何ですか?
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のミラー ).
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み] C++のファンクターとその使い方とは?
-
[解決済み] 無名/匿名の名前空間と静的関数の比較
-
[解決済み】type()とisinstance()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】C++で文字列定数を定義するには?[重複している]
-
[解決済み】C++の「翻訳ユニット」とは何ですか?