C++ 名前空間
クラスに Zara という名前の生徒が 2 人いる状況があるとします。彼らを明確に区別するには、名前に加えて、自宅の住所や両親の住所などの追加情報を使用する必要があります。名前など
C++ アプリケーションでも同じ状況が発生します。たとえば、xyz() という関数を作成すると、同じ関数 xyz() が別の利用可能なライブラリに存在する場合があります。こうすることで、コンパイラはどの xyz() 関数を使用しているかを認識できなくなります。
そのため、名前空間の概念は、特に上記の問題を解決するために導入されました。これは、異なるライブラリ内で同じ名前の関数、クラス、変数などを区別するための追加情報として使用できます。名前空間を使用すると、コンテキストが定義されます。基本的に、名前空間はスコープを定義します。
名前空間を定義する
以下に示すように、名前空間はキーワード namespace に続いて名前空間の名前を使用して定義されます:
namespace namespace_name { // 代码声明 }
名前空間を使用して関数または変数を呼び出すには、以下に示すように、名前の前に namespace を追加します:
name::code; // code 可以是变量或函数
名前空間が変数や関数などのエンティティのスコープをどのように定義するかを見てみましょう:
#include <iostream> using namespace std; // 第一个命名空间 namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // 第二个命名空间 namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } int main () { // 调用第一个命名空间中的函数 first_space::func(); // 调用第二个命名空间中的函数 second_space::func(); return 0; }
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
Inside first_space Inside second_space
using ディレクティブ
using namespace ディレクティブを使用すると、ネームスペースを使用するときにネームスペース名を先頭に追加する必要がなくなります。このディレクティブは、後続のコードで指定された名前空間内の名前を使用することをコンパイラーに指示します。
#include <iostream> using namespace std; // 第一个命名空间 namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // 第二个命名空间 namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // 调用第一个命名空间中的函数 func(); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Inside first_space
using ディレクティブを使用して、名前空間内の特定の項目を指定することもできます。たとえば、std 名前空間の cout 部分のみを使用する場合は、次のステートメントを使用できます。
using std::cout;
後続のコードでは、cout を使用するときに名前空間名にプレフィックスを付ける必要はありませんが、std 名スペース内の他のプロジェクトには、以下に示すように、名前空間名をプレフィックスとして付ける必要があります:
#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
std::endl is used with std!
using ディレクティブによって導入された名前は、通常のスコープルール。名前は、using ディレクティブからスコープの終わりまで表示されます。このとき、スコープ外に定義された同名のエンティティは非表示になります。
不連続な名前空間
名前空間はいくつかの異なる部分で定義できるため、名前空間は個別に定義されたいくつかの部分で構成されます。名前空間のさまざまなコンポーネントは、複数のファイルに分散できます。
したがって、名前空間の一部のコンポーネントが別のファイルで定義された名前を要求する必要がある場合でも、その名前を宣言する必要があります。次の名前空間定義では、新しい名前空間を定義したり、既存の名前空間に新しい要素を追加したりできます:
namespace namespace_name { // 代码声明 }
ネストされた名前空間
次のように、別の名前空間に新しい要素を追加できます。
namespace namespace_name1 { // 代码声明 namespace namespace_name2 { // 代码声明 } }
:: 演算子を使用して、ネストされた名前空間のメンバーにアクセスできます。
// 访问 namespace_name2 中的成员 using namespace namespace_name1::namespace_name2; // 访问 namespace:name1 中的成员 using namespace namespace_name1;
上記のステートメントで、namespace_name1 が使用されている場合、次のように、namespace_name2 の要素もスコープで使用できます。上記のコードがコンパイルされて実行されると、次の結果が生成されます:
#include <iostream> using namespace std; // 第一个命名空间 namespace first_space{ void func(){ cout << "Inside first_space" << endl; } // 第二个命名空间 namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // 调用第二个命名空间中的函数 func(); return 0; }