2011-08-08 8 views
1

경우 헤더 파일의 외부 자격 : 그러나 내가 좋아하는사용 "네임 스페이스 foo는 {"대신 명시 적으로 기능이 같은 선언

void foo::bar() { 
    ... 
} 

:

namespace foo { 
    void bar(); 
} 

대부분의 사람들은 이런 식으로 함수를 정의

namespace foo { 
    void bar() { 
     ... 
    } 
} 

필자는 항상 foo ::를 다시 입력하지 않기 때문에이 스타일을 선호합니다. 동일한 네임 스페이스에서 선언 된 유형을 허용하는 함수 매개 변수에서 지루한 경우가 종종 있습니다. 또한 전체 네임 스페이스의 이름을 쉽게 바꿀 수 있습니다.

다른 사람들 코드에서 제 스타일을 거의 볼 수없는 이유가 궁금합니다. 또 다른 들여 쓰기 레벨 외에 단점도 있습니까? (네임 스페이스를 들여 쓰지 않아도됩니까?)

+4

'대부분의 사람들은 ...'? '왜 다른 민족의 코드에서 제 스타일을 거의 볼 수 없는지 궁금합니다. ' – Nawaz

+0

어? 당신이 본 코드의 사람들이 얼마나 큰가요? 나는 거의 예전의 모습을 보지 못했다 ... – Nim

+1

나는 들쭉날쭉 한 같은 스타일을 꾸준히 사용한다 ... 이것은 나에게 상당히 주관적인 질문이다. –

답변

4

foo::bar 양식을 사용하고 실수로 잘못된 인수로 함수를 정의하면 컴파일러 오류가 발생합니다. 정의를 소스 파일의 네임 스페이스에 넣으면 다른 인수는 으로 정의되어 다른 함수가 정의됩니다. 함수를 사용하는 코드 (DLL의 경우 에는 런타임까지 없을 수 있음)에 연결하기 전까지는 오류가 발생하지 않습니다.

+0

tl; dr :'foo :: bar' 형식은 선언이 아닌 정의 일 수 있습니다. 그렇 겠지. –

+0

@Tomalak 네. 이 구문은 정의가 아닌 선언에는 적합하지 않습니다. –

+0

"정의 할 수없는 선언이 될 수 없습니다"* then :) –

-2
namespace foo { 
    void bar { 
     ... 
    } 
} 

여러 정의 오류가 발생할 수 있습니다. 이 오류는 링크시 발생합니다.

namespace foo을 헤더 파일에 넣고 그 안에 bar() 함수를 정의했다고 가정 해보십시오. 이제이 헤더 파일을 여러 .cpp 파일에 포함하면 foo::bar()의 여러 정의가 생성됩니다. 따라서 링커 오류입니다.

[참고 :. 나는 첫번째 경우에, 당신이 .cpp 파일에 foo::bar을 정의한다고 가정]

+2

음, 정말로? 그리고 대안은 "할 수 있습니까?" –

+0

@Tomalak, 나는 당신을 못마땅 해. '네임 스페이스 foo { void bar(); }'는 링커 오류를 발생시키지 않습니다. 왜냐하면'foo :: bar()'가'.cpp' 파일에 정의되어 있다고 가정하기 때문입니다. – iammilind

+0

왜 2 downvotes. 답안에서 잘못된 점은 무엇입니까? – iammilind

0

명령 줄에 foo::bar을 찾기 쉽지 않다. grep에 foo::bar을 갖는 것은 아주 좋습니다.

관련 문제