Cpp module 00-ネーミングスペース(namespace)


ネーミングスペース(namespace)


識別子の競合


識別(identifier)は、変数名、クラス、構造体、列挙型、関数、クラスメンバー関数、typedef名などを定義するために使用される.
認識者がルールを定めることにより,同一範囲内で認識者を繰り返すことはできない.someの名前で変数を宣言した場合、関数またはタイプの名前として同じ名前は使用できません.
番組規模の拡大と複数の作業に伴い、識別子の競合が発生する可能性が高い.そのため、言語面からより根本的な解決方法が必要です.これは、ネーミングスペースが必要な理由です.
ネーミング空間は識別者の記憶の領域であり,識別者が属する空間である.各空間領域を作成し、その領域に識別子をグループ化して配置すると、識別子の競合の可能性が大幅に減少します.
ネーミングスペースが異なる場合は、重複認識者でも問題ありません.ネーミングスペースを定義する基本フォーマットは次のとおりです.
namespace 네임스페이스 이름
{
    변수나 함수 선언
}
ネーミングスペース名も識別子の一種であり、識別子を作成するルールに従って作成する必要があります.
ネーミングスペースに属する識別子を参照する場合は、::演算子の前にネーミングスペースの名前を付けて、属することを示します.A::iは、ネーミングスペースAに属するiを意味する.
ネーミングスペースが個別に定義されていなくても、グローバルネーミングスペースと呼ばれる常に存在するネーミングスペースがあります.もともと存在するため、他のネーミングスペース名はありません.
int i;          // 전역 네임스페이스 소속
namespace A
{
    int i;      // A 소속
}

void func(void)
{
    int i;
    
    i = 1;      // 지역변수 i
    ::i = 2;    // 전역 네임스페이스 i
    A::i = 3;   // A 네임스페이스 i
}

int main(void)
{
    func();
    return (0);
}

ネーミングスペースを作成するルール

  • ネーミングスペースの名前も識別子であり、他の識別子と重複することはできません.
  • ネーミングスペースは、グローバル領域に宣言する必要があります.
  • ネーミングスペース内で別のネーミングスペースを宣言できます.
  • namesapce Game
    {
        namespace Graphic
        {
            struct Screen{};
        }
        namespace Sound
        {
            struct Sori {};
        }
    }
  • ネーミングスペースを複数回宣言できます.
  • namespace A
    {
        double i;
    }
    namespace A
    {
        char name[32];
    }
  • ネーミングスペースには名前が付いていない可能性があります.
  • namespace
    {
        int internal;
    }
  • ネーミングスペース内で関数を定義する場合、ヘッダファイルにのみプロトタイプを宣言し、インプリメンテーションファイルに関数のボディを作成します.
  • ネームスペースの使用


    ネーミングスペースに宣言された識別子を使用するには、そのたびにネーミングスペースを明記して参照するのが面倒です.
    int main(void)
    {
        MYNS::value = 3;
        MYNS::score = 1.2345;
        MYNS::func();
        return (0);
    }
    このような不便を解決する3つの方法が提供された.

  • インジケータの使用(direction)
    グローバル領域には使用インジケータがあり、その領域でMYNSが使用されていることを示します.以降のグローバル領域では、MYNSに属する識別子はMYNS::なしで使用される.
    インジケータの影響を使用する範囲は、インジケータが存在する領域に限定されます.
  • #include <iostream>
    
    namespace MYNS
    {
        int value;
        double score;
        void func(void)
        {
            std::cout << "I am func" << std::endl;
        }
    }
    
    using namespace MYNS;
    
    int main(void)
    {
        value = 3;
        score = 1.2345;
        func();
        return (0);
    }
    
  • 使用宣言(宣言)
    インジケータを使用すると、指定したネーミングスペース内のすべての識別子が取得されますが、宣言を使用して1つの識別子のみが取得されます.
    使用宣言を持つブロックのみに影響します.
  • #include <iostream>
    
    namespace MYNS
    {
        int value;
        double score;
        void func(void)
        {
            std::cout << "I am func" << std::endl;
        }
    }
    
    int main(void)
    {
        using MYNS::value;
    
        value = 3;
        MYNS::score = 1.2345;
        MYNS::func();
        return (0);
    }
    
    void subfunc(void)
    {
        MYNS::value = 3;
    }
    別名

  • ネーミングスペースは、競合を防止するために長い名前を提供します.名前が長すぎると、面倒になり、コードが乱れてしまいます.この場合、namespace A = VeryVeryLongNameSpaceName;のように短い別名を定義することができる.
  • name space VeryVeryLongNameSpaceName
    {
        struct Person {};
    }
    
    int main(void)
    {
        namespace A = VeryVeryLongNameSpaceName;
        A::Person P;
    }

    ソース


    http://soen.kr/lecture/ccpp/cpp3/34-1-1.htm
    http://soen.kr/lecture/ccpp/cpp3/34-1-2.htm
    http://soen.kr/lecture/ccpp/cpp3/34-1-3.htm