名前の有効範囲をファイルスコープに制限したい場合に利用する.
次のように名前空間名を指定せずにnamespace
で囲むと,同一ファイル内からは見えるけど,
他のファイルからは見えないグローバル変数などをつくることができる.
この名前空間名が与えられていない名前空間のことを無名名前空間(unnamed namespace)と呼ぶ(7.3.1 unnamed namespace).
namespace { int gvar; }
static
じゃないの?
C言語ではグローバル変数や関数の名前をファイルスコープに制限したい(同一ファイル内からは見えるけど他のファイルからは見えない状態にしたい)場合,
“static
”キーワードを使って,“static int gvar
”のように宣言することになっていた.
しかし,このstatic
というキーワードは,本来は記憶クラス(storage class)を静的(static)にする意味の修飾子で,
特例として(static
と書かなくても)最初から記憶クラスが静的なものにstatic
をつけた場合にだけ
名前をファイルスコープに制限する意味になるという変則的な規則になっている.
この文脈によって意味が変わってきてわかりにくいところが不評で,C++ではstatic
ではなく無名名前空間を使うようになっている.
資料によっては,“anonymous namespace”(匿名名前空間)という語を使っているときがあるけど, 規格での正式な名称は“unnamed namespace”(無名名前空間). 規格には“anonymous”はでてきていないのだけど,“anonymous namespace”と呼んでいる資料も多いので, もしかしたら,規格になる途中の段階では“anonymous”と呼んでいた時期があるのかもしれない.