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. C++ - クラスの名前空間
- 6. C#XPATHの名前空間
- 7. C++ - 名前空間
- 8. C++名前空間の使用法と命名規則
- 9. 他の名前空間内の名前空間からの関数の使用
- 10. 再利用無名の名前空間の機能
- 11. PHP - PSR-4オートローディングコンポーザーの名前空間付きファイルの名前空間を使用
- 12. XML上の名前空間の使用
- 13. 名前空間でのRecursiveIteratorIteratorの使用
- 14. は、私はC++での名前空間の内部または外部の「名前空間を使用して」
- 15. 別の名前空間内からのC++グローバル名前空間アクセス
- 16. 名前空間C#.NET
- 17. ユニティC#グローバル名前空間
- 18. C#と名前空間
- 19. XMLDOM名前空間の使用
- 20. PHPの名前空間と "使用"
- 21. イニシャライザリストの名前空間を使用
- 22. C++ライブラリ名前空間とC linux関数との間の名前の衝突
- 23. 名前空間に名前の変数を使用する
- 24. 名前空間内のC#のフィールドメソッド
- 25. C++の名前空間の競合
- 26. C++の名前空間別のソース・ファイル
- 27. JavaScriptのC#名前空間のメカニズム
- 28. ユニットテスト無名空間のC++コード
- 29. C++のマクロと名前空間
- 30. C++ 17:pmr名前空間クラスのコンパイラサポート
の下に与えられた同じ名前のクラス、識別子、およびより多くの情報function.forリンクをクリックして間の競合を解決するためにも、このトピックを参照してください:[静的オーバー無名の名前空間の優位性を?]( http://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static) – Nawaz