소년코딩

04.08 - using 명령문

표준 라이브러리를 많이 사용하는 경우, 표준 라이브러리에서 사용을 위해서 std::를 입력해야 한다.

C++은 using 명령문을 사용한 단순한 방법을 제공한다.


The using declaration

단순화하는 한 가지 방법은 using 선언문을 사용하는 것이다.

#include <iostream>

int main()
{
   using std::cout; // 이 using 선언문은 cout이 std :cout으로 사용된다는 것을 컴파일러에 알려준다.
   cout << "Hello world!"; // so no std:: prefix is needed here!
   return 0;
}

using 선언문 using std::cout;을 사용하면 컴파일러에 std namespace에서 cout을 사용할 것이라고 알려준다. 따라서 cout을 사용할 때마다 std::cout을 의미한다고 가정할 것이다. 만약 std:cout과 cout의 다른 사용법 사이에 이름 충돌이 있으면 std::cout이 선호된다.

위 간단한 예제는 많은 노력을 들이지 않고 함수 내부에서 cout을 많이 사용하는 경우 using 선언을 사용하여 코드를 더 읽기 쉽게 만들어준다. 그러나 사용하는 이름에 대한 선언(Ex. using std::endl, using std::cin)을 일일이 해줘야 하는 번거로움이 있다.


The using directive

일을 단순화하는 또 다른 방법은 using 지시문을 사용하는 것이다.

#include <iostream>

int main()
{
   using namespace std; // 이 using 지시문은 std 네임스페이스의 모든 것을 사용하고 싶다는 것을 컴파일러에 말해준다.
   cout << "Hello world!"; // so no std:: prefix is needed here!
   return 0;
}

using 지시문 using namespace std;은 컴파일러에 "std 네임스페이스의 모든 것을 사용하고 싶다"고 말하므로 컴파일러가 인식하지 못하는 이름을 찾으면 std 네임스페이스를 검사한다. 따라서 컴파일러가 "cout"(인식할 수 없는)을 발견하면 std 네임스페이스에서 찾는다. 만약 std:cout과 cout의 다른 사용법 사이에 이름 충돌이 있으면 오류가 발생한다.

설명을 위해 using 지시문의 모호함을 일으키는 예제를 살펴보자:
#include <iostream>

namespace a
{
    int x(10);
}

namespace b
{
    int x(20);
}

int main()
{
    using namespace a;
    using namespace b;

    std::cout << x << '\n';

    return 0;
}

위 예제에서 컴파일러는 x가 a::x와 b::x 중에 무엇을 참조해야 하는지 확인할 수 없다. 이 경우, “ambiguous symbol” 오류가 뜨며 컴파일하는 데 실패한다. using 지시문 중 하나를 제거하거나 명시적인 a:: 또는 b:: 접두어를 붙여 사용해야 이 오류를 해결할 수 있다.

또 다른 모호한 예제:
#include <iostream> // imports the declaration of std::cout

int cout() // declares our own "cout" function
{
    return 5;
}

int main()
{
    using namespace std; // makes std::cout accessible as "cout"
    cout << "Hello, world!"; // uh oh!  Which cout do we want here?  The one in the std namespace or the one we defined above?

    return 0;
}

위 예에서 컴파일러는 std:cout 함수와 정의한 cout함수 중 어떤 것을 의미했는지 결정할 수 없어, " 모호한 기호" 오류로 컴파일하지 못한다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/4-3c-using-statements/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기