C++名前空間

名前空間(ネームスペース)について

名前空間とは

名前空間とは、変数名や関数名などの名前衝突を回避するために導入されたスコープ定義の機能です。

オブジェクト指向の大規模な開発はクラス名などの名前定義の衝突が発生しがちとなりますが、名前空間を使用すると効果的な管理ができるようになります。

名前空間は、1つのグローバルスコープを複数のスコープに分割する機能といえます。


名前空間の定義

名前空間は、「namespace」宣言子と、「{ }(ブロック)」によって表現します。


namespace NAME{
    // NAMEスコープの定義
}

スコープ演算子(スコープ解決演算子)

名前空間で定義した変数や関数を利用する場合、使用する変数をどのスコープに属しているか明示する必要があります。

以下の形式で、名前空間を明示します。


名前空間::変数名;

名前空間のサンプル

main()関数のローカル変数buffと名前空間sample_nameの変数buffを利用します。

それぞれ別の変数として値を保持し、出力することができます。


#include <iostream>

namespace sample_name
{
    int buff;   // sample::buff
}

int main()
{
    int buff;
    
    buff = 12345;          // buffに代入
    sample_name::buff = 67890;  // sample::buffに代入
    
    std::cout << buff << std::endl;
    std::cout << sample_name::buff << std::endl;

    return(0);
}

usingについて

usingとは

「using」文を用いると、定義した名前空間を現在の名前空間に追加することができます。


using namespace 名前空間名;

名前空間に追加とは、using宣言以降のソース中では特定の名前空間へのアクセスを行なう際にスコープ演算子を省略することを意味します。

例えば、標準C++ではすべての標準ライブラリが「stdネームスペース」に定義されていますが、stdネームスペースを宣言すると、そのソースコード中ではライブラリを利用する際に「std::」を省略することができます。


using namespace std;
cin  // 標準入力ストリーム       本来は「std::cin」と書きます。
cout // 標準出力ストリーム        本来は「std::cout」と書きます。
cerr // 標準エラー出力ストリーム  本来は「std::cerr」と書きます。
endl // ストリームのフラッシュ    本来は「std::endl」と書きます。

現在の名前空間への追加する

任意の名前空間を追加することで、同名関数の使い分けを行うことができます。

スコープによって呼ぶべき関数を一意にできるという性質があります。


#include <iostream>
using namespace std;

namespace sample_name1
{
    void func(void){cout << "sample_name1" << endl;}
}

namespace sample_name2
{
    void func(void){cout << "sample_name2" << endl;}
}

int main()
{
    // 名前空間を追加する
    using namespace sample_name2;
    func();  // sample_name2::func()を呼び出す

    return(0);
}

その他名前空間

グローバル名前空間

名前空間に囲まれていない変数や関数は、グローバル名前空間(大域名前空間) という扱いになります。

グローバル名前空間には名前がありませんが、名前空間であることに代わりはありません。

スコープ演算子を使い、「::変数名」と明示することで識別できます。


#include <iostream>
using namespace std;

namespace sample_name1
{
    int buff = 1234;  //  sample_name1::buff
}

// 外部(グローバル)変数
int buff = 5678;      //  ::buff

int main()
{
    cout << sample_name1::buff << endl;
    cout << ::buff << endl;
    return(0);
}

無名名前空間

「無名名前空間」とはnamespaceの後に名前を続けなかったときに作成される空間です。

無名名前空間は、同一ファイル内でのみ参照できる識別子を格納します。

C言語におけるstatic変数と同じ様な扱いができます。(C++ではファイルスコープの変数を定義する場合にstaticではなく、namespaceを使うことを推奨しています。)


namespace {
    int buff;
}

関連ページ