C++で無名の名前空間を使用するのはいつですか?自立した機能よりも優れていますか?また、ヘッダーファイルではなく、ソースファイルでのみ使用する必要がありますか?C++の無名の名前空間の使用
答えて
Stroustrup氏によると、古いCであなたがstatic
グローバルを作っていた場所でそれを使用する必要があります。そのアイデアは、対象の項目がソースファイルの "グローバル"になることができますが、コンパイル中の他のソースファイルの名前空間は汚染されません。
つまり、static
グローバルをC++に作成しないでください。代わりに名前のない名前空間を使用する必要があります。
私は、彼らはヘッダファイルに有用であるいくつかの状況を発見したが、それは稀である必要があります。私はほとんど例外なく例外を宣言すると思います。その場合、問題の定義は、そのヘッダである#include
のすべてについてグローバルになりますが、そうでないものに対してはグローバルではありません。
'static'はFCD(n3225)の最新号で非推奨とマークされなくなりました。委員会は、単一の機能またはグローバルにはそれほど冗長ではないことを認識しました。宣言の近くに表示され、パーサを必要としないので、 "grep"も簡単です。 –
@Matthieu:しかし、関数には内部リンケージがあります。名前のない名前空間が「上位」と呼ばれる本当の理由は、オブジェクト/関数のリンケージを変更するのではなく、シンボルを「隠す」ということです。これはC++ 0xでは変更されていませんが、(1)外部リンケージが高価になる恐れがある場合、内部リンケージが必要です。これは、静的にすることを意味します。(2)この文脈ではCの互換性のために決して 'static'を削除するつもりはないので、それを非難することは空の脅威です。 –
@Steve:私はリンクを変更することも期待していましたが、誰もそのシンボルを知っていなければ、それを外部に維持する目標は何ですか? –
名前の非表示に使用されます。名前のない名前空間はそれぞれ一意です。リンクhereがより詳細に説明されています。これは通常、ソースファイル内で使用され、内部リンケージのみが必要な機能(例えば、外部に公開されていない機能)を隠すために使用されます。
無名名前空間には、翻訳単位にプライベートであり、これには、リンクの競合が発生しないように、異なる翻訳単位で発生する同じ名前のグローバル変数や関数を保護するために使用することができます。
たとえば、あなただけの.cppファイルで定義され、そのファイルだけ内で使用されるクラスを必要としています。それをCModuleLock
としたいとします。名前のない名前空間に含まれておらず、他のいくつかの.cppファイルに、別のクラスCModuleLock
が無名の名前空間にない場合、プログラムをリンクすることはできません。
私は時々、民間の内部クラス可能性があり、クラスのために無名の名前空間を使用しますが、私はおそらく同様のクラス(の間で共有したいと思います同じ概念を実装している人)。もちろん、クラスが一般的なものになった場合、名前付き名前空間に移動します – RichardBruce
名前の名前空間は、グローバル静的変数や関数の「C++バージョン」です。クラスに名前のない名前空間を使用することもできます。
- 1. 無名名前空間
- 2. ネスト無名の名前空間
- 3. C++での名前空間
- 4. C++名前空間の使用法と命名規則
- 5. XML上の名前空間の使用
- 6. PHPの名前空間と "使用"
- 7. イニシャライザリストの名前空間を使用
- 8. 別の名前空間内からのC++グローバル名前空間アクセス
- 9. 名前空間C#.NET
- 10. C++の名前空間別のソース・ファイル
- 11. 名前空間なしのGroovy XMLSlurper名前空間エラー
- 12. ユニットテスト無名空間のC++コード
- 13. 名前空間
- 14. C++名前(匿名)名前空間定義
- 15. C++クラスの宣言と名前空間
- 16. C++のマクロと名前空間
- 17. 名前空間のないC#コード?
- 18. 名前空間内のC++グローバル変数
- 19. デシリアライズが...その名前空間.NET 4/C#を使用して
- 20. C++ビルダーXE2のWindows.Management名前空間を使用
- 21. 名前空間: "グローバルとして使用"
- 22. XAML名前空間の命名規則
- 23. 名前空間宣言の修飾名
- 24. phpの名前空間を使用したHMVCパターンのコントローラーの名前付け
- 25. Wcfサービスプロキシの名前/名前空間の命名方法
- 26. 名前空間のエラー
- 27. PHPの名前空間5.2
- 28. 変数の名前空間
- 29. 名前空間のjqueryプラグイン
- 30. VIM:マーカーの名前空間
の下に与えられた同じ名前のクラス、識別子、およびより多くの情報function.forリンクをクリックして間の競合を解決するためにも、このトピックを参照してください:[静的オーバー無名の名前空間の優位性を?]( http://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static) – Nawaz