2010-12-05 3 views
17

설득력있는 주장이 있습니다. againstusing namespace std, 그렇다면 어째서 언어에 도입 된 것입니까? using namespace 네임 스페이스의 목적을 무효화하지 않습니까? 왜 내가 using namespace을 쓰고 싶습니까? 내가 using namespace에 의해 우아하게 해결 된 것을 알지 못하는 어떤 문제가 있습니까? 어쩌면 using std::swap 관용구 또는 그와 비슷한 내용일까요?"네임 스페이스 사용"의 목적은 무엇입니까?

+11

적은 입력 꽤 매혹적인 인수가 주변 작업 또는 네임 스페이스에있다 '사용'사용의 개념은 – delnan

+0

...하지만 그건 필요하면 거기에. – kenny

+3

또한 허브 셔터의 [ ". 네임 스페이스로 마이그레이션"] (http://www.gotw.ca/publications/migrating_to_namespaces.htm)를 참조 –

답변

21

는 우선,이 네임 스페이스 (예를 들어, using namespace std::rel_ops; 또는 using namespace boost::assign;)

간결 또한 강력한 인수입니다에 연산자 오버로드를 사용하는 방법입니다. _1 대신 std::placeholders::_1을 타이핑하고 읽는 것을 정말로 즐기시겠습니까? 또한 함수 스타일로 코드를 작성하면 stdboost 네임 스페이스에있는 무수히 많은 객체를 사용할 수 있습니다.

또 다른 중요한 사용은 (일반적으로 비록 하나가 전체 네임 스페이스를 가져 오지 않습니다) 수 있도록하는 것입니다 인수에 의존 룩업 :

template <class T> 
void smart_swap(T& a, T& b) 
{ 
    using std::swap; 
    swap(a, b); 
} 

스왑은 T와 같은 네임 스페이스에 T 어떤 종류의 과부하 경우 , 이것은 그 과부하를 사용할 것입니다. 대신 std::swap을 명시 적으로 호출 한 경우 해당 과부하는 고려되지 않습니다. 다른 유형의 경우이 값은 std::swap으로 돌아갑니다.

사실, 모호성이있는 경우 항상 이름을 정규화 할 수 있으므로 선언/지시어 사용은 네임 스페이스의 목적을 무효화하지 않습니다.

+0

인가 + 1, 그게 매우 convening 아트입니다 :) –

+2

개인적으로 나는 ""을 사용하여 "사용하는 네임 스페이스 "과 잘 맞습니다 (rel_ops와 같은 몇 가지 예외가 있습니다). –

2

대부분의 경우 코드 작성을위한 바로 가기입니다. 둘러싼 컨텍스트에 이름을 가져올 수 있습니다. 대개 .cpp 개의 파일로 제한합니다. .h 파일에 using 지시문을 포함하면 파일이 포함 된 모든 파일이 오염되기 때문에 대개이 파일을 .cpp 개의 파일로 제한합니다. 또 다른 좋은 방법은 using namespace을 가능한 한 가장 포괄적 인 환경으로 제한하는 것입니다 (예 : 메소드 본문 선언의 내부). 나는 편의를 참조 더 이상, 그리고 같은 별칭을 네임 스페이스에 유사한

namespace po = boost::program_options; 

한 다음

po::variables_map ... 
0

사람들은 특히 using namespace BigCorpusing namespace std;하지만 반대 쓸 수 없습니다 또는 std::cout (네임 스페이스를 사용하고 있습니다. 의미가 무엇인지 알고있는 경우 using이 아닙니다.) 또한 using namespace std에 대한 대부분의 이의 제기는 헤더 파일에 있습니다. 효과를 즉시 볼 수있는 소스 파일에서는 해가 덜 큽니다.

네임 스페이스는 내가 사용하는 라이브러리에 Date라는 클래스가 있더라도 Date라는 클래스를 가질 수있는 매우 유용한 개념입니다. 언어에 추가되기 전에 우리는 GCDateGCString (내 회사, Gregory Consulting, predates std::string)과 같은 것을 가져야했습니다. (using 키워드를 사용하거나 사용하지 않고) 네임 스페이스를 사용하면 더 깨끗하고 깨끗한 코드를 작성할 수 있습니다. 그러나 매번 Gregcons::string라고 말하면, 깨끗하고 깔끔한 부분을 잃을 수도 있습니다. [면책 조항 : 더 이상 실제로 내 자신의 문자열 클래스를 사용하지 않습니다.] 그게 using 문장의 매력입니다. 머리말을 지우지 말고 std에 적용하지 마십시오. 일반적으로 문제가 발생하지 않도록하십시오.깊이 중첩 된 네임 스페이스와 라이브러리로 작업 할 때

+0

'using namespace foo'는 사용하지 말고'foo :: whatever'을 사용하십시오. 표준 및 다른 이름 모두에 적용됩니다. 예를 들어 헤더에서 행해지 지 않으면'std :: cout'을 사용하는 것은 아무런 문제가 없습니다. – celtschk

0

나는 유용 찾을 수 있습니다. Boost 라이브러리는 그러한 예입니다. 이미징 입력 boost::numeric::ublas::matrix<double> m 여기 저기로 ...

헤더 파일에 using namespace을 수행하고 있습니다. 이는 헤더를 포함하는 프로그램을 망가 트릴 가능성이 있기 때문입니다. 항상 using namespace 문을 .cpp/.cxx 파일에 두어 파일 범위로 제한하십시오.

+2

하지만 네임 스페이스 별칭으로이 문제를 해결할 수 있습니다. 아니면'matrix' 만 선택적으로 가져올 수 있습니다. – jalf

+2

또는 typedef를 사용할 수 있습니다 (예 : 'typedef boost :: numeric :: ublas :: matrix DoubleMatrix' 그리고 나머지 코드에서는'DoubleMatrix'를 사용하십시오. 그것은 C++의 아름다움/저주입니다. 동일한 문제를 해결하기위한 몇 가지 방법이 있습니다. – CadentOrange

-1

"네임 스페이스는 이름으로 클래스, 객체 및 함수와 같은 그룹 엔티티 수 있습니다. 글로벌 범위에서 분할 될 수있다이 방법은"하위 범위 ", 식별자가 유효한 식별자와 실체입니다 자신의 이름을 각각. 네임 스페이스 "에 포함 된 클래스, 객체, 함수의 집합입니다

여기

더 많은 정보 : http://www.cplusplus.com/doc/tutorial/namespaces/

1

using namespace가 도입 된 주된 이유는 이전 버전이었다 호환성 : 당신이 사전 네임 스페이스 코드 많이있는 경우 표준 라이브러리 함수와 클래스를 (미리 표준 버전보다) 많이 사용하면, 표준 컴파일러로 코드 작업.

BTW, C++ 98 적어도 인수 종속 조회 규칙은 using namespace std::rel_ops하지가 (이 표준의 이후 버전에서 변경 한 경우 나도 몰라) 템플릿에서 원하는 것을 할 것이라는 점을 의미한다.

예 : namespace foo에서 using namespace 중 하나를 넣어 도움이되지 않습니다

template<typename T> bool bar(T t) 
{ 
    return t > T(); 
} 

namespace foo 
{ 
    class X {}; 
    bool operator<(X, X); 
} 

using namespace std::rel_ops; 

int main() 
{ 
    X x; 
    bar(x); // won't work: X does not have operator> 
} 

참고. 정확한 지점 도움말에서 선언를 사용

그러나

:

template<typename T> bool bar(T t) 
{ 
    return t > T(); 
} 

namespace foo 
{ 
    class X {}; 
    bool operator<(X, X); 
    using std::rel_ops::operator>; 
} 

int main() 
{ 
    X x; 
    bar(x); // now works: operator> found per ADL via the using declaration in `namespace foo` 
}