左中括弧の前に ID のないネーム・スペースは、名前なしネーム・スペースになります。
各変換単位は、それ自体の固有の名前なしネーム・スペースを含むことができます。
次の例は、名前なしネーム・スペースがいかに有用であるかを示しています。
#include <iostream> using namespace std; namespace { const int i = 4; int variable; } int main() { cout << i << endl; variable = 100; return 0; }
上記の例で、名前なしネーム・スペースは、スコープ・レゾリューション演算子を使用しないで i および variable にアクセスすることを許可しています。
名前なしネーム・スペースを、不適切に使用している例を以下に示します。
#include <iostream> using namespace std; namespace { const int i = 4; } int i = 2; int main() { cout << i << endl; // error return 0; }
コンパイラーは、グローバル名と、同じ名前を持つ名前なしネーム・スペースのメンバーとを 区別できないので、main の内部では i はエラーの原因となります。上記の例が作用するためには、ネーム・スペースは ID によって一意的に識別される必要があります。 そして、i は、使用しているネーム・スペースを指定する必要があります。
名前なしネーム・スペースは、同じ変換単位内で拡張できます。 次に例を示します。
#include <iostream> using namespace std; namespace { int variable; void funct (int); } namespace { void funct (int i) { cout << i << endl; } } int main() { funct(variable); return 0; }
funct のプロトタイプおよび定義の両方共、同じ名前なしネーム・スペースのメンバーです。
関連参照