"네임 스페이스 STD를 사용하는 이유는 무엇입니까?나쁜 연습으로 간주됩니까?


질문

 

나는 네임 스페이스 STD를 사용하여 글을 쓰는 다른 사람들이 들었습니다.코드에서 잘못된 것이고, STD :: Cout와 STD :: Cin을 직접 사용해야합니다.

네임 스페이스 STD를 사용하는 이유는 무엇입니까?나쁜 연습을 고려 했습니까?그것은 비효율적이거나 모호한 변수를 선언 할 위험이 있습니까 (STD 네임 스페이스의 함수와 동일한 이름을 공유하는 변수)?성능에 영향을 미칩니 까?


답변

 

이것은 성능과 관련이 없습니다.그러나 이것을 고려하십시오 : 당신은 foo와 bar라는 두 라이브러리를 사용하고 있습니다.

using namespace foo;
using namespace bar;

모든 것이 잘 작동하며 문제없이 바에서 foo와 quux ()에서 blah ()를 호출 할 수 있습니다.그러나 언젠가는 새로운 버전의 Foo 2.0 버전으로 업그레이드합니다. 이제는 Qux ()라는 함수를 제공합니다.이제 충돌이 있습니다. Foo 2.0 및 Bar 가져 오기 Qux ()를 전역 네임 스페이스로 가져옵니다.이것은 특히 기능 매개 변수가 일치하는 경우 특히 수정하기 위해 노력할 것입니다.

Foo :: Blah () 및 Bar :: Quux ()를 사용한 경우 Foo :: Qux ()의 도입은 비 이벤트가 있었을 것입니다.



답변

그렉이 쓴 모든 일에 동의하지만, 나는 추가하고 싶습니다 : 그렉이 말했다.

Library Foo 2.0은 수년 동안 호출 된 코드보다 Bar :: Qux ()보다 Quux ()에 대한 통화 중 일부에 대한 호출에 대한 모호하지 않게 더 잘 일치하는 기능, Qux ()를 소개 할 수 있습니다.그런 다음 코드가 여전히 컴파일되지만 자동으로 잘못된 함수를 호출하고 하나님을 알고 있습니다.그것은 일이 일할 수있는 것만 큼 나쁜 것입니다.

STD 네임 스페이스는 톤의 식별자가 있음을 명심하십시오. 많은 코드는 다른 코드에도 나타날 가능성이 매우 높은 매우 일반적인 것들 (생각 목록, 정렬, 문자열, 반복자 등)입니다.

이 답변을 알 수없는이 답변을주었습니다 (이 답변을주었습니다.여기에 또 다른 최근의 질문이 있습니다. 그래서 이것은 실제 문제입니다.


더 많은 데이터 포인트가 있습니다. 많은, 몇 년 전, 나는 표준 라이브러리에서 std ::와 함께 모든 것을 접두어주는 데 짜증을내는 데 짜증이났습니다.그런 다음 Function Scope를 제외하고 지시문과 선언을 사용하는 시작에서 결정된 시작에서 결정된 프로젝트에서 일했습니다.뭔지 맞춰봐?접두사를 쓰는 데 익숙해지기 위해 우리 대부분은 몇 주가 걸렸고 몇 주 후에 우리 대부분의 대부분은 실제로 코드를 더 읽기 쉽게 만들었습니다.이유가 있습니다 : 짧거나 더 긴 산문을 원하는지 여부는 주관적이지만 접두사는 객관적으로 코드에 명확성을 추가합니다.컴파일러뿐만 아니라 어떤 식별자를 참조하는 것을 쉽게 찾을 수 있습니다.

10 년 만에 그 프로젝트는 수백만 줄의 코드를 갖도록 성장했습니다.이러한 토론이 다시 발생하기 때문에 나는 한 번 호기심이었습니다. 실제로 프로젝트에서 실제로 사용되는 기능 범위가 얼마나 자주 사용되었는지 궁금했습니다.나는 그것에 대한 소스를 그만 낳았으며 그것이 사용 된 곳에서 하나 또는 두 개의 장소 만 발견했습니다.나에게 이것은 한 번 시도한 일단 개발자가 100 kloc마다 지침을 사용하여 사용하기에 충분한 고통스럽지 않음을 나타냅니다.


결론 : 모든 것을 명시 적으로 접두사하는 것은 아무런 해를 끼치 지 않으며 익숙해지지 않고 객관적인 이점을 가지고 있습니다.특히 컴파일러와 인간 독자가 코드를 쉽게 해석하기 쉽고 코드를 작성할 때 주요 목표가되어야합니다.



답변

클래스의 헤더 파일에 네임 스페이스를 사용하는 문제는 클래스 (헤더 파일을 포함하여)를 사용하려는 사용자를 '사용'(즉, I.E..e.에서 모든 것을 참조하십시오) 다른 네임 스페이스를 사용하는 것입니다.

그러나 (비공개) * .cpp 파일에 사용 설명서를 자유롭게 넣을 수 있습니다.


어떤 사람들은 CPP 파일의 사용 진술이 헤더보다 더 낫지 만 (헤더 파일을 포함하는 사람들에게 영향을 미치지 않기 때문에)이란 이렇게 말하는 사람들은 내 말을 동의하지 않기 때문에(코드에 따라 클래스의 구현을 유지하기가 더 어려워 질 수 있기 때문에).이 C ++ Super-FAQ 항목은 말합니다.

사용 지시문은 레거시 C ++ 코드를 위해 존재하며 네임 스페이스로의 전환을 쉽게 할 수 있지만 적어도 새로운 C ++ 코드가 아닌 정기적으로 사용해서는 안됩니다.

FAQ는 두 가지 대안을 제안합니다.

사용 - 선언 : std :: cout;// 사용법을 사용하면 자격없이 Cout을 사용할 수 있습니다. cout << "값 :"; 그냥 std :: std :: cout << "값 :";



답변

나는 최근 Visual Studio 2010에 대한 불만을 제기했습니다. 모든 원본 파일이 두 줄을 보유하고 있음을 밝혀졌습니다.

using namespace std;
using namespace boost;

많은 부스트 기능이 C ++ 0x 표준으로 들어가고 Visual Studio 2010에는 많은 C ++ 0x 기능이 있으므로 이러한 프로그램이 컴파일되지 않았습니다.

따라서 네임 스페이스 X를 사용하는 것을 피하십시오.사용중인 라이브러리 및 / 또는 헤더 파일 변경을 확실하게하는 방법은 미래 방지의 형태입니다. 사용중인 헤더 파일이 프로그램을 끊지 않을 것입니다.



답변

짧은 버전 : 헤더 파일에서 선언이나 지시문을 사용하여 전역을 사용하지 마십시오.구현 파일에서 자유롭게 사용하십시오.Herb Sutter와 Andrei Alexandrescu는 C ++ 코딩 표준 에서이 문제에 대해 말해야 만합니다.

요약 네임 스페이스 화음은 사용자의 편의를 위해서, 다른 사람들을 인증 할 수있는 것은 아닙니다. #include 지시문 전에 사용을 사용하지 마십시오. Corollary : 헤더 파일에서 지시문을 사용하거나 선언을 사용하여 네임 스페이스 수준을 작성하지 마십시오.대신, 명시 적으로 모든 이름을 자격을 얻습니다.(헤더가 다른 헤더 #InCludes가 나타날 수 있는지를 알 수 없기 때문에 두 번째 규칙은 첫 번째 규칙이 다음과 같습니다. 논의 짧은 : 선언과 지시문을 사용하여 네임 스페이스를 사용하여 #include 지시문 이후에 구현 파일에서 자유롭게 사용해야합니다.반대로 반복적 인 어설 션에도 불구하고 선언과 지시문을 사용하는 네임 스페이스는 악이 아니며 네임 스페이스의 목적을 물리 칠 수 없습니다.오히려, 그들은 네임 스페이스를 사용할 수있는 것입니다.



답변

글로벌 범위, 특히 헤더에서 사용 지시문을 사용해서는 안됩니다.그러나 헤더 파일에서도 적절한 상황이 있습니다.

template <typename FloatType> inline
FloatType compute_something(FloatType x)
{
    using namespace std; // No problem since scope is limited
    return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));
}

이것은 짧고 사용자 정의 부동 소수점 유형 (ADL)을 통해 사용자 정의 된 부동 소수점 유형으로 작업 할 수 있기 때문에 명시 적 자격 (std :: sin, std :: cos ...)보다 낫습니다.

출처:https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice