2011-03-15 22 views
63

C++で無名の名前空間を使用するのはいつですか?自立した機能よりも優れていますか?また、ヘッダーファイルではなく、ソースファイルでのみ使用する必要がありますか?C++の無名の名前空間の使用

+2

の下に与えられた同じ名前のクラス、識別子、およびより多くの情報function.forリンクをクリックして間の競合を解決するためにも、このトピックを参照してください:[静的オーバー無名の名前空間の優位性を?]( http://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static) – Nawaz

答えて

57

Stroustrup氏によると、古いCであなたがstaticグローバルを作っていた場所でそれを使用する必要があります。そのアイデアは、対象の項目がソースファイルの "グローバル"になることができますが、コンパイル中の他のソースファイルの名前空間は汚染されません。

つまり、staticグローバルをC++に作成しないでください。代わりに名前のない名前空間を使用する必要があります。

私は、彼らはヘッダファイルに有用であるいくつかの状況を発見したが、それは稀である必要があります。私はほとんど例外なく例外を宣言すると思います。その場合、問題の定義は、そのヘッダである#includeのすべてについてグローバルになりますが、そうでないものに対してはグローバルではありません。

+2

'static'はFCD(n3225)の最新号で非推奨とマークされなくなりました。委員会は、単一の機能またはグローバルにはそれほど冗長ではないことを認識しました。宣言の近くに表示され、パーサを必要としないので、 "grep"も簡単です。 –

+6

@Matthieu:しかし、関数には内部リンケージがあります。名前のない名前空間が「上位」と呼ばれる本当の理由は、オブジェクト/関数のリンケージを変更するのではなく、シンボルを「隠す」ということです。これはC++ 0xでは変更されていませんが、(1)外部リンケージが高価になる恐れがある場合、内部リンケージが必要です。これは、静的にすることを意味します。(2)この文脈ではCの互換性のために決して 'static'を削除するつもりはないので、それを非難することは空の脅威です。 –

+2

@Steve:私はリンクを変更することも期待していましたが、誰もそのシンボルを知っていなければ、それを外部に維持する目標は何ですか? –

8

名前の非表示に使用されます。名前のない名前空間はそれぞれ一意です。リンクhereがより詳細に説明されています。これは通常、ソースファイル内で使用され、内部リンケージのみが必要な機能(例えば、外部に公開されていない機能)を隠すために使用されます。

25

無名名前空間には、翻訳単位にプライベートであり、これには、リンクの競合が発生しないように、異なる翻訳単位で発生する同じ名前のグローバル変数や関数を保護するために使用することができます。

たとえば、あなただけの.cppファイルで定義され、そのファイルだけ内で使用されるクラスを必要としています。それをCModuleLockとしたいとします。名前のない名前空間に含まれておらず、他のいくつかの.cppファイルに、別のクラスCModuleLockが無名の名前空間にない場合、プログラムをリンクすることはできません。

+0

私は時々、民間の内部クラス可能性があり、クラスのために無名の名前空間を使用しますが、私はおそらく同様のクラス(の間で共有したいと思います同じ概念を実装している人)。もちろん、クラスが一般的なものになった場合、名前付き名前空間に移動します – RichardBruce

1

名前の名前空間は、グローバル静的変数や関数の「C++バージョン」です。クラスに名前のない名前空間を使用することもできます。