名前なしネーム・スペース

C++左中括弧の前に 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 のプロトタイプおよび定義の両方共、同じ名前なしネーム・スペースのメンバーです。

注:
名前なしネーム・スペースで定義された項目は、内部結合を持っています。 キーワード static を使用して、内部結合を持つ項目を定義するよりも、 代わりに名前なしネーム・スペースでそれらの項目を定義します。

関連参照

IBM Copyright 2003