C++ 네임스페이스


한 학급에 Zara라는 이름의 학생이 두 명 있는 상황을 가정해 보겠습니다. 이들을 명확하게 구별하기 위해 이름을 사용하는 것 외에도 집 주소나 부모님의 이름과 같은 몇 가지 추가 정보를 사용해야 합니다. 이름 등

C++ 애플리케이션에서도 동일한 상황이 발생합니다. 예를 들어 xyz()라는 함수를 작성할 수 있으며 동일한 함수 xyz()가 사용 가능한 다른 라이브러리에 존재할 수 있습니다. 이렇게 하면 컴파일러는 어떤 xyz() 함수를 사용하고 있는지 알 수 없습니다.

그래서 위의 문제를 해결하기 위해 특별히 네임스페이스 개념을 도입했습니다. 이는 서로 다른 라이브러리에서 동일한 이름을 가진 함수, 클래스, 변수 등을 구별하기 위한 추가 정보로 사용할 수 있습니다. 네임스페이스를 사용하면 컨텍스트가 정의됩니다. 기본적으로 네임스페이스는 범위를 정의합니다.

네임스페이스 정의

네임스페이스는 아래와 같이 키워드 namespace와 네임스페이스 이름을 사용하여 정의됩니다.

namespace namespace_name {
   // 代码声明
}

네임스페이스가 있는 함수나 변수를 호출하려면 다음을 추가해야 합니다.

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 directive

using 네임스페이스 지시어를 사용하면 네임스페이스를 사용할 때 네임스페이스 이름을 앞에 붙일 필요가 없습니다. 이 지시어는 후속 코드가 지정된 네임스페이스의 이름을 사용할 것임을 컴파일러에 알려줍니다.

#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;

위 문에서 네임스페이스_name1을 사용하면 다음과 같이 네임스페이스_이름2의 요소도 범위에서 사용할 수 있습니다.

#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;
}

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다:

Inside second_space