1. ホーム
  2. c++

[解決済み] 無名/匿名の名前空間と静的関数の比較

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の質問で。

クレジットはこちら マイク・パーシー このことを教えてくれたのは