プログラミング言語が持つ機能の1つである名前空間のうち、それ自体には名前が付けられていないもののことです。
ソースコード内で名前空間を記述するとき、通常は名前空間自体の名前を指定しますが、プログラミング言語によっては、名前を省略することで無名名前空間を記述できます。
名前がある通常の名前空間には、ほかの場所で定義されている同名の識別子と区別するための名前となる役割があります。たとえば、name という変数名だけでは、ほかの場所で定義される異なる変数との区別がつけられませんが、MyProgram名前空間と MyLibrary名前空間のような名前空間の中で定義されていれば、それぞれを MyProgram::name、MyLibrary::name として区別できます。
無名名前空間には名前がないので、それぞれの中で定義される名前を区別して使用するという目的はなく、スコープを限定することにだけ目的があります。
C++ では「unnamed namespace」と呼ばれます。
C++ の無名名前空間に属する名前は内部結合を持ちます。そのため、無名名前空間内に定義された識別子は翻訳単位ごとに別個に扱われ、ほかの翻訳単位からはアクセスできません。そのため、通常は .cpp などの拡張子を持つソースファイルの側で使用します。
内部結合を与えるには、C言語と同様の static指定子を付加する方法もありますが、static という名称と、内部結合になるという結果の関係性がわかりづらいため、無名名前空間を使うほうがコードの意図が明確になるという利点があります。また、static は変数と関数にしか付加できないので、クラスや列挙型などを型定義する場合には無名名前空間を使う必要があります。無名名前空間ならば複数の名前の定義をまとめて囲むことができることも利点の1つです。
namespace { // 無名名前空間
int x {10}; // 内部結合
void func() // 内部結合
{
// ...
}
}詳細な解説は、新C++編「スコープと名前空間」を参照してください。
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Facebook でシェア | X で ポスト/フォロー |
| LINE で送る | noteで書く |
|
| 管理者情報 | プライバシーポリシー |