無名名前空間

名前の有効範囲をファイルスコープに制限したい場合に利用する. 次のように名前空間名を指定せずに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という言い方もある?

資料によっては,“anonymous namespace”(匿名名前空間)という語を使っているときがあるけど, 規格での正式な名称は“unnamed namespace”(無名名前空間). 規格には“anonymous”はでてきていないのだけど,“anonymous namespace”と呼んでいる資料も多いので, もしかしたら,規格になる途中の段階では“anonymous”と呼んでいた時期があるのかもしれない.

リンク


はたいたかし
2012-04-07 anonymousの綴り間違い訂正(Thanks,tetsuya_29さん[1]).
2002-09-01 初稿
トップ > 開発ツール > C++