문제

C ++ 네임 스페이스를 사용할 때는 다음과 같이 명시 적으로 이름을 지정하는 것이 좋습니다.

std::cout << "Hello, world!\n";

아니면 선호합니까? using namespace:

using namespace std;
cout << "Hello, world!\n";

후자를 선호한다면 파일 또는 함수 범위에서 찾은 것을 선언합니까?

개인적으로 나는 명시 적으로 이름을 선호합니다 - 더 타이핑하지만 네임 스페이스 혼합물을 사용할 때 (예 : std 그리고 boost) 더 읽기 쉬운 것을 알았습니다.

도움이 되었습니까?

해결책

나는 항상 사용합니다 using namespace STD & BOOST의 경우. 코드를 혼란스럽게 할 정도로 많이 사용되지 않는 한 명시적인 네임 스페이스를 사용하는 경향이 있습니다.

헤더에서는 사용하지 않습니다 using namespace #inincluding 소스의 글로벌 네임 스페이스 오염을 피하기 위해.

다른 팁

추가 타이핑은 여기서 문제가되지 않습니다. 명시 적으로 자격을 갖춘 이름의 문제는 시각적 혼란입니다. C ++ 구문은 어수선합니다. 불필요하게 이름을 더 길게 만들고 코드를 관대하게 뿌려서 더 악화시킬 필요가 없습니다. ::에스.

저는 Jeff Atwood와 함께 있습니다. 최고의 코드는 코드가 전혀 없습니다. 이건 정말 진실.

네임 스페이스 가져 오기는 단점없이 혼란을 줄이는 좋은 방법입니다. 열린 네임 스페이스의 범위가 단일 컴파일 장치로 줄어드는 한1, 이름 충돌이 나타나면 쉽게 해결할 수 있습니다.

명백한 이름이 (일반적으로) 더 읽기 쉬워야하는 이유는 항상 나에게 미스터리였습니다. 독자들은 일반적으로 시맨틱을 추론 할 수있을 정도로 코드를 충분히 알아야합니다. 그렇지 않은 경우 코드는 어쨌든 수정해야합니다.


1) COROLLARY : 아니요 using 헤더에서!

나는 항상 명시적인 것을 사용합니다. STD를 쓰는 것은 저를 해치지 않으며 어디에서 왔는지 분명히 알 수 있습니다. 자신의 "문자열", "벡터"등으로 관리 할 레거시 프로젝트가있을 때 유용합니다. 코드가 제공하는 정보가 많을수록 더 좋습니다.

내 일반적인 규칙은 항상 헤더에서 네임 스페이스를 명시 적으로 사용하고 일반적으로 코드에서 사용하는 것입니다. 전자의 이유는 정의의 모든 부분에서 사용되는 내용의 모든 부분에서 명시 적으로 명확하게하기 때문입니다. 후자의 이유는 필요한 경우 다른 네임 스페이스에서 쉽게 교체 할 수 있기 때문입니다. 즉, std :: string 대신 foo :: string을 사용하려면 std :: string의 모든 인스턴스를 코드에서 foo :: string으로 바꾸지 않고 헤더와 사용 명령문을 업데이트하면됩니다.

물론, 그것은 STD :: 네임 스페이스에 상주하는 클래스에 유용하지 않습니다. 한 클래스를 교체하더라도 STD에서 다른 클래스를 사용할 가능성이 높고 모호성 문제가 발생할 수 있지만 이는 예일뿐입니다.

using 그리고 using namespace 코드를 더 읽기 쉽게 렌더링하는 데 매우 유용합니다. 혼란을 제거하십시오.

그러나 어떤 경우에도 기호가 어디에서 왔는지 알아 내기가 더 어려워지면 전체 네임 스페이스 가져 오기를 거부합니다.

가져온 네임 스페이스의 범위를 제한하려고합니다.

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

"일반적으로 알려진"라이브러리와 같은 std, 나는 감히 사용할 것입니다 using namespace std. 이 코드를 읽는 모든 사람들 이이 상징들을 알고 있다고 믿을만한 이유가 있습니다.

사이드 노트로서 using 키워드는 또한 파생 클래스가 과부하 된 슈퍼 클래스의 멤버를 내보내는 것을 나타내는 데 사용됩니다.

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}

모호성이있을 때만 명시적인 네임 스페이스를 사용합니다. 더 읽기 쉽지만 추가 타이핑은 너무 지루하고 다른 개발자가 표준 라이브러리에 대한 기준 수준을 가지고 있다고 가정해야합니다.

내가 네임 스페이스를 철자하는 유일한 시간은 빠른 디버그 문을 추가하는 것과 같이 또는 비표준 비표준 라이브러리를 사용하는 것과 같이 한두 번만 사용할 때입니다.

일반적으로 파일 범위에서 네임 스페이스를 선언하지만 네임 스페이스를 믹싱하는 경우 선언이 사용되는 지점에 더 가깝게 표시되는 것이 좋습니다.

using 함수 범위에서 또는 함수가 매우 작은 경우 (종종 IS) 명시적인 네임 스페이스 만

.CPP 파일의 상단에서 필요한 이름을 명시 적으로 가져 오는 경향이 있으므로 ...

std :: cout 사용; std :: endl 사용;

등...

그렇게하면 내가 사용하는 이름을 제어 할 수 있으며 어디에서 왔는지 쉽게 알 수 있으며 사용 시점에서 코드가 혼란스럽지 않습니다.

다른 네임 스페이스에서 두 개의 이름을 사용하는 드문 경우에는 사용 시점에서 완전히 자격이 있습니다.

나는 항상 헤더에 완전히 자격을 갖춘 이름을 사용하고 '네임 스페이스 x'를 사용하여 거의 사용하지 않습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top