2009-12-05 10 views
6

.cpp 파일에서 어떤 차이가 있습니까/선호합니까? 내부/외부 익명 네임 스페이스 Typedef?

// file scope outside any namespace 
using X::SomeClass; 
typedef SomeClass::Buffer MyBuf; 

V/s의 익명의 네임 스페이스에서 형식 정의를 배치 훨씬 포인트가 없다

namespace { // anonymous 
    using X::SomeClass; 
    typedef SomeClass::Buffer MyBuf; 
} 

답변

5

. 익명의 네임 스페이스의 주된 용도는 외부 링크가있는 정의를 배치하여 번역 단위 간의 심볼 충돌을 방지하는 것입니다.

+0

흠 익명의 네임 스페이스가 파일의 다른 네임 스페이스를 포함하여 전체 파일 내용에 대해 범위를 갖고 있다고 생각했습니다. 어쨌든 외부 연결 규칙을 제외하고 파일 범위에 파일을 넣는 것과 동일하게 만듭니다. 외부 링키지 규칙이 typedef와 같은 구문 설탕과 관련이 있고 사용하는 것이 확실하지는 않습니다. – Jay

+0

네가 맞아, 익명의 네임 스페이스에 using 선언문을 두거나 아무것도 변경하지 않는다. 나는 틀렸다. 나는 이것을 편집했다. – Thomas

7

나는 두 번째 사용법이 적어도 지금까지 보아온 코드에서는 드물다는 것을 말할 것이다. (그리고 나는 많은 코드 C++을 보았다). 두 번째 기술의 추론이 무엇인지 설명해 주시겠습니까?

일반적으로 C++ 구현 파일에서 익명의 네임 스페이스를 사용하여 '정적'이 C (또는 C++이지만)에서 수행 할 것과 동일한 것을 달성합니다. 즉, 그 점을 보완합니다. 즉 기호의 가시성을 현재 번역 단위. typedef는 링커가 링크 할 수있는 구체적인 의미로 '구체적인'것을 만들지 않으므로 실제로 링커가 볼 수 있도록 내 보낸 심볼을 생성하지 않습니다.

내 권장 사항은 무엇입니까? 첫 번째 표기법을 사용합니다. 두 번째 것은 불필요한 합병증을 추가하며 내 의견으로는 당신에게 아무 것도 사지 않습니다.

+0

정적 대신 네임 스페이스 {}를 사용하는 것은 나에게 해킹처럼 보였습니다. 결코 그것을 좋아하거나 사용하지 않았습니다. 그들이 정적의 900 만 가지 다른 용도에 대해 걱정했다면 그들은 새로운 키워드를 도입 했어야합니다 .. –

+2

이상하게도 C 프로그래밍의 공평한 분배를 했음에도 불구하고 정적이 아닌 익명의 네임 스페이스를 선호합니다. 정확히 9 백만 건의 정적 사용과 계산으로 익명의 네임 스페이스를 사용할 수 있습니다. 또한, 좀 더 간결하고 '정적'으로 접두사를 붙이는 것을 잊어 버리는 것보다 망치기가 더 어렵습니다. –

+0

나는 이제 사라진 익명의 네임 스페이스에서 많은 디버그 작업을했습니다. 남아있는 유일한 유용한 것은 typedef와 using입니다. 따라서 파일 범위로 이동하고 익명의 네임 스페이스를 정크할지 여부를 논의했습니다. – Jay