回答:
基本的には、C ++ 03標準のセクション7.3.1.1/2を参照しています。
名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は非推奨です。名前のない名前空間は、優れた代替手段を提供します。
この段落はC ++ 11ですでに削除されていることに注意してください。static
関数は標準ごとに廃止されなくなりました!
それでも、主にキーワードstatic
が変数の宣言と関数にのみ適用され、ユーザー定義の型には適用されないため、無名の名前空間はstaticキーワードよりも優れています。
次のコードはC ++で有効です
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
しかし、このコードは無効です:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
したがって、解決策は、名前のない名前空間です。これは、
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
なぜunnamed-namespace
がに勝るのか説明してほしいstatic
。
また、(標準に従って)名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は推奨されないことに注意してください。
deprecated
発言は最新のC ++ 0x FCD(n3225)から削除されたようです。
.cpp
、同じ名前のクラスを定義しています。
これに関連する興味深い問題があります:
この関数はモジュールによって内部的に使用され、モジュールの外部からはアクセスできないようになっているため、static
キーワードまたは無名namespace
を使用して、モジュール(翻訳単位)の一部の関数を作成するとします。(名前namespace
のないsには、関数の他に、データと型の定義も内部的に作成できるという利点があります)。
時間の経過とともに、モジュールの実装のソースファイルが大きくなり、それをいくつかの個別のソースファイルに分割すると、コードの整理が容易になり、定義をすばやく見つけて、独立してコンパイルできるようになります。
しかし、ここで問題に直面します。これらの関数は、実際にはモジュールを参照してstatic
いるのでstatic
はなく、ソースファイル(翻訳単位)を参照しているため、モジュールを参照することはできません。そのモジュールの他の部分(オブジェクトファイル)からアクセスできるようにするために、それらを非作成にする必要があります。しかし、これはまた、モジュールに対して非表示/プライベートではなくなったことも意味します。外部リンケージがあるため、他のモジュールからアクセスできますが、これは本来の意図ではありませんでした。static
名前namespace
もこの問題を解決しません。特定のソースファイル(翻訳単位)に対しても定義されており、外部からアクセスできないためです。
一部のnamespace
がprivate
、つまり、その中で定義されているものはすべて、それが属するモジュールによって内部的に使用されることを意図していると指定できればすばらしいでしょう。しかし、もちろんC ++には「モジュール」のような概念はなく、ソースファイルに密接にバインドされている「翻訳単位」だけがあります。
C ++標準は、セクション7.3.1.1名前なし名前空間の段落2を読みます。
名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は非推奨です。unnamed-namespaceは、より優れた代替手段を提供します。
staticは、オブジェクト、関数、および無名共用体の名前にのみ適用され、型宣言には適用されません。
static
。