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함수 중 어떤 것을 의미했는지 결정할 수 없어, " 모호한 기호" 오류로 컴파일하지 못한다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/4-3c-using-statements/ 입니다.
'C++ 이야기 > 04. 스코프' 카테고리의 다른 글
C++ 04.07 - 네임스페이스, std (namespace) (5) | 2018.06.29 |
---|---|
C++ 04.06 - 스코프, 주기 및 링크 요약 (Scope, duration, and linkage summary) (1) | 2018.06.28 |
C++ 04.05 - static, 정적 변수 (2) | 2018.06.28 |
C++ 04.04 - 전역 변수가 나쁜 이유 (Why global varibles are evil) (0) | 2018.06.28 |
C++ 04.03 - 전역 변수와 링크 (Global variable and linkage) (1) | 2018.06.28 |