名前空間

クイック リファレンス

用法 解説
namespace id { ... } 名前空間idの定義
using namespace std; usingディレクティブ. スコープ解決演算子(::)を使わずに 名前空間stdにアクセスできるようにする.
using std::cout; using宣言. 単にcoutといったら,std::coutの意味と解釈されるようになる.
namespace { ... } 無名名前空間の定義. スコープをファイル内に限定したいときに用いる(C言語のstaticに相当).
::global_variable グローバル変数globa_variableをさすことを明示する表現.
namespace abc = std 名前空間の別名を定義する. この例ではstdに別名abcを与えている.

using宣言(using declaration)

usingの2つの用法
用法
usingディレクティブ用法 using namespace std;
using宣言用法 using std::cout

通常はusingディレクティブ用法(using namespace std;のような形式)を使って, ある名前空間(この例ではstd)を丸ごとアクセスできるようにするのだけども, 場合によっては,ある名前空間の中の特定の変数・関数だけをカレントスコープに取り込みたいという場合もある. たとえば,std::coutだけが必要で,他の変数・関数は使わないというような場合, 次のように宣言しておけばよい.

#include <iostream>
using std::cout;

無名名前空間(unnamed namespace)

名前空間の定義では,識別子を指定せずに名前のない名前空間とすることもできる[参考:無名名前空間]. これは,名前空間に呼び名(識別子)を与えないことで, その名前空間で定義した変数や関数を他のファイルからアクセスできなくする効果がある.

C言語ではキーワードstaticがこの役割をかねていたが, C言語のstaticは文脈によって記憶クラスを変更する意味だったり, スコープを変更する意味だったりして,誤解や混乱を誘発しやすかったように思う. C++の無名名前空間は意味合いが明確になってよくなった.

※資料によっては,無名名前空間に“anonymous namespace”という英訳をあてている場合があるが, 規格(ISO/IEC 14882:1998)の用語では“unnamed namespace”(7.3.1.1)となっている.

参考:iostreamiostream.h

namespaceが導入されたことにともない, 標準ライブラリはすべて名前空間stdの中に宣言されることになった. ただし,何も工夫せずにこれをやってしまうと,古い(ver. 2以前の)C++処理系との互換性がとれなくなってしまう (古いC++ソースにusing namespace std;を書き加えていくだけでよいのだけども). そこで,実際の処理系では,ヘッダーファイルを2系統にわけ, iostream.hのようにサフィックス.hがついているものでは従来どおりグローバルの名前空間に宣言し, iostreamのようにサフィックスがついていないものでは名前空間std内に宣言するようにした. 端的にいえば,iostreamは次のようになっている.

namespace std {
#include <iostream.h>
}

…と いうのは少し前までの状況で,現在ではiostreamだけしか提供していない処理系もある (たとえばMicrosoft Visual Studio 2005).


はたいたかし
2001-07-21 初稿
2006-08-18 改訂 Visual C++ 2005ではiostreamのみの提供になっていることを追記.
トップ > 開発ツール > C++