설득력있는 주장이 있습니다. againstusing namespace std
, 그렇다면 어째서 언어에 도입 된 것입니까? using namespace
네임 스페이스의 목적을 무효화하지 않습니까? 왜 내가 using namespace
을 쓰고 싶습니까? 내가 using namespace
에 의해 우아하게 해결 된 것을 알지 못하는 어떤 문제가 있습니까? 어쩌면 using std::swap
관용구 또는 그와 비슷한 내용일까요?"네임 스페이스 사용"의 목적은 무엇입니까?
답변
는 우선,이 네임 스페이스 (예를 들어, using namespace std::rel_ops;
또는 using namespace boost::assign;
)
간결 또한 강력한 인수입니다에 연산자 오버로드를 사용하는 방법입니다. _1
대신 std::placeholders::_1
을 타이핑하고 읽는 것을 정말로 즐기시겠습니까? 또한 함수 스타일로 코드를 작성하면 std
및 boost
네임 스페이스에있는 무수히 많은 객체를 사용할 수 있습니다.
또 다른 중요한 사용은 (일반적으로 비록 하나가 전체 네임 스페이스를 가져 오지 않습니다) 수 있도록하는 것입니다 인수에 의존 룩업 :
template <class T>
void smart_swap(T& a, T& b)
{
using std::swap;
swap(a, b);
}
스왑은 T와 같은 네임 스페이스에 T 어떤 종류의 과부하 경우 , 이것은 그 과부하를 사용할 것입니다. 대신 std::swap
을 명시 적으로 호출 한 경우 해당 과부하는 고려되지 않습니다. 다른 유형의 경우이 값은 std::swap
으로 돌아갑니다.
사실, 모호성이있는 경우 항상 이름을 정규화 할 수 있으므로 선언/지시어 사용은 네임 스페이스의 목적을 무효화하지 않습니다.
인가 + 1, 그게 매우 convening 아트입니다 :) –
개인적으로 나는 "
대부분의 경우 코드 작성을위한 바로 가기입니다. 둘러싼 컨텍스트에 이름을 가져올 수 있습니다. 대개 .cpp
개의 파일로 제한합니다. .h
파일에 using 지시문을 포함하면 파일이 포함 된 모든 파일이 오염되기 때문에 대개이 파일을 .cpp
개의 파일로 제한합니다. 또 다른 좋은 방법은 using namespace
을 가능한 한 가장 포괄적 인 환경으로 제한하는 것입니다 (예 : 메소드 본문 선언의 내부). 나는 편의를 참조 더 이상, 그리고 같은 별칭을 네임 스페이스에 유사한
namespace po = boost::program_options;
한 다음
po::variables_map ...
이
사람들은 특히 using namespace BigCorp
에 using namespace std;
하지만 반대 쓸 수 없습니다 또는 std::cout
(네임 스페이스를 사용하고 있습니다. 의미가 무엇인지 알고있는 경우 using
이 아닙니다.) 또한 using namespace std
에 대한 대부분의 이의 제기는 헤더 파일에 있습니다. 효과를 즉시 볼 수있는 소스 파일에서는 해가 덜 큽니다.
네임 스페이스는 내가 사용하는 라이브러리에 Date라는 클래스가 있더라도 Date라는 클래스를 가질 수있는 매우 유용한 개념입니다. 언어에 추가되기 전에 우리는 GCDate
과 GCString
(내 회사, Gregory Consulting, predates std::string
)과 같은 것을 가져야했습니다. (using
키워드를 사용하거나 사용하지 않고) 네임 스페이스를 사용하면 더 깨끗하고 깨끗한 코드를 작성할 수 있습니다. 그러나 매번 Gregcons::string
라고 말하면, 깨끗하고 깔끔한 부분을 잃을 수도 있습니다. [면책 조항 : 더 이상 실제로 내 자신의 문자열 클래스를 사용하지 않습니다.] 그게 using
문장의 매력입니다. 머리말을 지우지 말고 std
에 적용하지 마십시오. 일반적으로 문제가 발생하지 않도록하십시오.깊이 중첩 된 네임 스페이스와 라이브러리로 작업 할 때
'using namespace foo'는 사용하지 말고'foo :: whatever'을 사용하십시오. 표준 및 다른 이름 모두에 적용됩니다. 예를 들어 헤더에서 행해지 지 않으면'std :: cout'을 사용하는 것은 아무런 문제가 없습니다. – celtschk
나는 유용 찾을 수 있습니다. Boost 라이브러리는 그러한 예입니다. 이미징 입력 boost::numeric::ublas::matrix<double> m
여기 저기로 ...
헤더 파일에 using namespace
을 수행하고 있습니다. 이는 헤더를 포함하는 프로그램을 망가 트릴 가능성이 있기 때문입니다. 항상 using namespace
문을 .cpp/.cxx 파일에 두어 파일 범위로 제한하십시오.
하지만 네임 스페이스 별칭으로이 문제를 해결할 수 있습니다. 아니면'matrix' 만 선택적으로 가져올 수 있습니다. – jalf
또는 typedef를 사용할 수 있습니다 (예 : 'typedef boost :: numeric :: ublas :: matrix
"네임 스페이스는 이름으로 클래스, 객체 및 함수와 같은 그룹 엔티티 수 있습니다. 글로벌 범위에서 분할 될 수있다이 방법은"하위 범위 ", 식별자가 유효한 식별자와 실체입니다 자신의 이름을 각각. 네임 스페이스 "에 포함 된 클래스, 객체, 함수의 집합입니다
여기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`
}
적은 입력 꽤 매혹적인 인수가 주변 작업 또는 네임 스페이스에있다 '사용'사용의 개념은 – delnan
...하지만 그건 필요하면 거기에. – kenny
또한 허브 셔터의 [ ". 네임 스페이스로 마이그레이션"] (http://www.gotw.ca/publications/migrating_to_namespaces.htm)를 참조 –