2010-01-22 4 views
3

네임 스페이스를 올바른 (또는 최소한 최선의) 방법으로 사용하려고합니다.네임 스페이스 사용법

제가 시도한 첫 번째 일은 using namespace xxx;을 내 파일 시작 부분에 두지 않는 것입니다. 대신 using xxx::yyy을 가능한 한 로컬로 보내고 싶습니다.

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

int main() { 
    using std::cout; 
    using std::endl; 

    srand(time(0)); 

    for(int i=0; i<10;++i) 
     cout << rand() % 100 << endl; 

    return 0; 
} 

내가 cout 또는 endl를 사용하려고하고있을 때 using std::cout; 또는 using std::endl는, 컴파일러가 불평 라인을 생략하면 다음과 같습니다

이를 설명하는 작은 프로그램입니다. , randtime은 왜 필요하지 않습니까? 나는 그들이 정확히 std에 있다고 확신한다. 왜냐하면 내가 그들 앞에서 특별히 std::을 부어 주려고하면 내 코드가 잘 동작하기 때문이다.

답변

6

cstdlib 외 다수를 사용하는 경우. 그 (것)들의 이름은 global와 std :: namespace 둘 다에 놓여 지므로, 그것들에 std ::를 접두사로 붙이거나 선택할 수있다. 이것은 일부에 의해 기능으로 간주되며, 다른 사람에 의한 오용으로 간주됩니다.

+4

\ * 기침 \ * misfeature \ * 기침 \ * – GManNickG

3

정말로 알고 싶다면 ctimecstdlib 헤더를 자세히 살펴보십시오. 그들은 이전 버전과 호환 가능하도록 만들어졌습니다.

참고 :이 모든 usingusing namespace의 비즈니스는 대략적인 고해상도입니다. 당신의 IDE가 이 아니라면 네임 스페이스를 볼 필요가 없을 때, 네임 스페이스를 볼 필요가 없다면,이 컨스 트럭 트를 필요로하지 않을 것입니다 ...

+0

+1 더 똑똑한 IDE의 경우 ... – Inverse

3

나는 std :: cout을 사용하지 않고 그냥 생략하는 것을 선호합니다. 가독성을 유지할 때마다 이것은 아마도 더 큰 프로젝트에서만 유용 할 것이다.

+1

저는 두 번째입니다. (심지어 작은 프로젝트의 경우에도) 전체 네임 스페이스를 쓰는 것을 선호합니다. – laura

+1

그리고 뭔가가 특히 불쾌하고 사용되는 경우 좀 더 짧게 뭔가를 typedef 그것을 – Patrick

0

우리가 주제를 다루는 한, Koenig Lookup이라는 것도 있는데, 인수가 동일한 네임 스페이스에서 오는 경우 함수 이름 앞에 네임 스페이스 식별자를 생략 할 수 있습니다. 예를 들어

#include <iostream> 
#include <algorithm> 
#include <vector> 

void f(int i){std::cout << i << " ";} 
int main(int argc, char** argv) 
{ 
    std::vector<int> t; 
    // for_each is in the std namespace but there's no *std::* before *for_each* 
    for_each(t.begin(), t.end(), f); 
    return 0; 
} 

글쎄, 그것은 직접적으로 관련이하지만 난 그것을 유용 할 수 있지만.

+0

나는 표준에 의해 보장의 생각하지 않습니다'std :: vector :: iterator'입니다 std 네임 스페이스에서. 일부 구현 정의 네임 스페이스에있을 수도 있고 원시 포인터가 될 수도 있습니다. 그래서 저는 이것이 단지 하나의 예일 뿐이라는 것을 알고 있지만 좋은 습관이라고 생각하지 않습니다. –

+0

@Steve Jessop - 저는 우리가 알아야 할 좋은 것임을 말하지 않았습니다 :-) – Serge

+0

koenig 조회 결과입니다. 반복자가 int 배열에 대한 포인터 인 경우 실패합니다. 어떤 다른 jokers 네임 스페이스에서 for_each()로 끝날 수 있기 때문에 std ::에 대해 명시해야하는 또 다른 이유가 있습니다. –