[解決済み] 無名/匿名の名前空間と静的関数の比較
2022-03-17 16:31:58
質問
C++の特徴として、以下のように無名(匿名)の名前空間を作成することができます。
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
名前空間の名前を指定できないので、その中にあるものに外からアクセスすることは不可能です。しかし、これらの無名名前空間は は あたかも暗黙のusing-clauseがあるかのように、作成されたファイル内にアクセスすることができます。
質問ですが、なぜ、あるいはどのような場合に、静的関数を使用するよりもこの方法が望ましいのでしょうか?それとも、本質的に全く同じことをするための2つの方法なのでしょうか?
どのように解決するのですか?
C++規格では、7.3.1.1 非名称名前空間 第2項を読みます。
static キーワードの使用は でのオブジェクトの宣言は非推奨です。 名前空間スコープを使用する場合は、unnamed-namespaceを使用します。 は、優れた代替手段を提供します。
Staticは、オブジェクト、関数、匿名組合の名前にのみ適用され、型宣言には適用されません。
編集する
のこの使用を非推奨とすることを決定しました。
static
キーワード(翻訳ユニット内の変数宣言の可視性に影響する)は取り消されました(
レフ
). この場合
static
または無名の
namespace
は、本質的に全く同じことをする2つの方法であることに戻っています。 より詳しい説明は
これ
SOの質問です。
名無しさん
namespace
には、翻訳単位のローカルな型を定義できるという利点があります。 以下はその例です。
これ
詳しくはSOの質問で。
クレジットはこちら マイク・パーシー このことを教えてくれたのは
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】無名名前空間が使用される理由とその利点は何ですか?
最新
-
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 実装 サイバーパンク風ボタン