用法 | 解説 |
---|---|
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 ディレクティブ用法 |
using namespace std;
|
using 宣言用法 |
using std::cout
|
通常はusing
ディレクティブ用法(using namespace std;
のような形式)を使って,
ある名前空間(この例ではstd
)を丸ごとアクセスできるようにするのだけども,
場合によっては,ある名前空間の中の特定の変数・関数だけをカレントスコープに取り込みたいという場合もある.
たとえば,std::cout
だけが必要で,他の変数・関数は使わないというような場合,
次のように宣言しておけばよい.
#include <iostream> using std::cout;
名前空間の定義では,識別子を指定せずに名前のない名前空間とすることもできる[参考:無名名前空間]. これは,名前空間に呼び名(識別子)を与えないことで, その名前空間で定義した変数や関数を他のファイルからアクセスできなくする効果がある.
C言語ではキーワードstatic
がこの役割をかねていたが,
C言語のstatic
は文脈によって記憶クラスを変更する意味だったり,
スコープを変更する意味だったりして,誤解や混乱を誘発しやすかったように思う.
C++の無名名前空間は意味合いが明確になってよくなった.
※資料によっては,無名名前空間に“anonymous namespace”という英訳をあてている場合があるが, 規格(ISO/IEC 14882:1998)の用語では“unnamed namespace”(7.3.1.1)となっている.
iostream
とiostream.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).
iostream
のみの提供になっていることを追記.