2010-01-16 3 views
6

Possible Duplicates:
Why is ‘using namespace std;’ considered a bad practice in C++?
Using std NamespaceC++ 네임 스페이스 - "사용"하거나 명시 적으로 언급 했습니까?

환경 설정에 관한 문제입니까? 또는

using namespace std; 
#include <string> 
myString string; 

또는

#include <string> 
myString std::string; 

를 선호에 대한 유효한 이유는 유형에 드래그, 이름 충돌의 가능성을 방지하는 동안이 명시 적으로 네임 스페이스 각 시간을 알리는 것을 가정 (또는 컴파일러는 것이 모호성에 대해 경고합니까?)

질문 : 설득력있는 주장이 있습니다.

+2

많은 다른 많은 사람들 사이에 http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c가 있습니다. –

+0

네가 맞아! 내가 검색했을 때 왜 그걸 찾지 않았 니? 죄송합니다 – Mawg

답변

4

이것은 동일한 주제에 대해 쓴 다른 답변의 수정 된 버전입니다. 지금 버전 3까지.

코드에 count이라는 변수가 있고 using namespace std; 인 변수가있는 경우 중요한 의미는 이름 충돌입니다. 이는 의미가 모호합니다. 그것은 단지 count이 아닙니다. reverseequal도 포함되며 모든 공통 식별자입니다. 예를 들어,이 컴파일 오류가 발생합니다 : 컴파일러에 대한 모든 문제를 무시하고

#include <algorithm> 
using namespace std; 

int count; 
int main(int argc, char* argv[]){ 
    count = 1; 
} 

, 그것은 또한 당신의 코드를 읽어 오는 사람을위한 문제입니다. 그 여분의 5 자 다음 사람이 당신이 string


을 그것은 또한 쓸 때 당신이 std::string 또는 mylib::string을 의미하는지 다른 모든 라인을 파일의 상단을 확인하지 않고도 의미를 정확하게 코드의 과학적 이해를 유지하는지 확인 헤더 파일에 using namspace xyz을 두지 말아야한다는 점에 유의해야합니다. 헤더 파일을 포함하는 모든 파일에 전파 할 수 있기 때문에 해당 네임 스페이스를 사용하지 않더라도 마찬가지입니다. 또 다른 문제는 std 네임 스페이스가 임포트 된 것이 확실하지 않다는 것입니다. 따라서 관리자 (또는 3 개월 째)가 동일한 컴파일 유닛에 포함 된 모호한 std 함수와 동일한 이름의 변수를 추가하고 그런 다음 컴파일 오류의 원인을 찾으려고 한 시간을 소비합니다.

은 스왑의 전문 버전이있는 경우, 컴파일러는 그것을 사용으로

using std::swap 

를 사용하는 것은 매우 유용 대부분의 경우, (유효 C++에서) 그렇지 않으면 std::swap 다시 떨어질 것이다 . std::swap으로 전화를 걸면 항상 기본 버전을 사용합니다. 기본 버전은 특수 버전을 호출하지 않습니다 (존재하는 경우에도 마찬가지 임).

코드 예를 들어 pimpl idiom을 사용하십시오. 기본 복사가 실제 구현의 모든 데이터를 복사 할 수있는 곳에서는 어디에서나 포인터를 바꿔야합니다. 스페셜 스왑을 사용하면 막대한 양의 실행 시간을 절약 할 수 있으며 잘 디자인 된 라이브러리가 특수화해야합니다.요약


,

  • 항상 using std::swap 전파로 인한 모든 비용에서 헤더에 using namespace std

  • std::swap()을 통해 피 선호 구현 파일에서 사용하지 않도록하려고합니다.

  • 모든 파일의 맨 위에 수천 개의 using std::foo이있는 것은 아닙니다. 대부분 공용 클래스에 사용하십시오.

다른 모든 의견입니다.

+0

롤 ... (거의)이 질문의 모든 속은 대답을 당신에 의해 ... : D 조 – missingfaktor

2

cpp 파일에서 사용하는 것이 좋습니다. 헤더에서 두 번째 구문을 선호하므로 프로젝트 전체에 전파되지 않습니다.

3

개인적으로 나는 using 지시문보다는 using 선언을 선호합니다. 예를 들어

:

#include<string> 
using std::string; 

string x="abc"; 

using 지시어를 사용하여 나중에 이름 충돌 문제가 발생할 수 있습니다 범위로 전체 공간을 제공합니다.

자세한 내용은 this (강력히 권장)을 참조하십시오.

관련 문제