정적보다 이름없는 네임 스페이스의 우수성?


129

명명되지 않은 네임 스페이스는 static키워드 보다 어떻게 우수 합니까?


그러나 표준위원회에 따르면 명명되지 않은 네임 스페이스는 namespace-static을 대체하기에 충분하지 않습니다 . 명명되지 않은 네임 스페이스가 실패하고 작동 하는 경우가 여전히 몇 가지static 있습니다.
legends2k

답변:


133

기본적으로 C ++ 03 표준의 §7.3.1.1 / 2 섹션을 참조하고 있습니다.

네임 스페이스 범위에서 객체를 선언 할 때는 static 키워드를 사용하지 않습니다. 명명되지 않은 네임 스페이스는 탁월한 대안을 제공합니다.

이 단락은 C ++ 11에서 이미 제거되었습니다. static기능은 더 이상 사용되지 않는 표준에 따릅니다!

그럼에도 불구하고 Unnamed 네임 스페이스는 정적 키워드보다 우수합니다. 키워드는 주로 사용자 정의 유형이 아니라 변수 선언 및 함수 static에만 적용 되기 때문 입니다.

다음 코드는 C ++에서 유효합니다

   //legal code
   static int sample_function() { /* function body */ }
   static int sample_variable;

그러나이 코드는 유효하지 않습니다 :

   //illegal code
   static class sample_class { /* class body */ };
   static struct sample_struct { /* struct body */ };

따라서 해결책은 이름없는 네임 스페이스입니다.

   //legal code
   namespace 
   {  
        class sample_class { /* class body */ };
        struct sample_struct { /* struct body */ };
   }

그것이 왜 unnamed-namespace우월하다는 것을 설명 하기를 바랍니다 static.

또한 네임 스페이스 범위에서 객체를 선언 할 때는 표준에 따라 정적 키워드를 사용하지 않는 것이 좋습니다.


11
보다 일반적으로 명명되지 않은 네임 스페이스는 외부 연결을 허용합니다. 이것이 로컬-번역 단위 클래스 선언을 가능하게하는 것입니다. 또한 외부 연결 문자열 상수를 템플릿 인수로 사용할 수 있습니다.
건배와 hth. -Alf

10
Fred Nurk가 다른 답변으로 언급 했듯이이 deprecated말은 최신 C ++ 0x FCD (n3225)에서 제거 된 것으로 보입니다 .
Matthieu M.

36
당신은 당신이 자신의 질문에 대답하고 자신에게 감사를 말하는 : -o
manpreet singh

11
cpp에서 클래스를 정의하는 것과의 차이점은 무엇입니까 (익명 네임 스페이스 없음, 정적 없음)?
루치안 그리고

6
@LuchianGrigore 2의 경우 .cpp같은 이름으로 클래스를 정의 할 때 연결 문제가 발생 합니다.
Xaqq

8

이와 관련된 흥미로운 문제가 있습니다.

이 함수는 모듈에서 내부적으로 사용되며 외부에서 액세스 할 수 없으므로 static키워드 또는 명명되지 않은 namespace함수를 사용하여 일부 기능을 모듈 (번역 단위) 내부로 만드는 것으로 가정 합니다. (이름없는 namespaces는 함수 외에도 데이터 및 유형 정의를 내부적으로 만들 수 있다는 이점이 있습니다).

시간이 지남에 따라 모듈 구현의 소스 파일이 커지고이를 여러 개의 개별 소스 파일로 분할하여 코드를보다 효과적으로 구성하고 정의를 더 빨리 찾고 독립적으로 컴파일 할 수 있습니다.

그 기능을 더 이상 할 수 없습니다 :하지만 지금 당신은 문제에 직면 static하기 때문에, 모듈에 static실제로 참조하지 않는 모듈 만에 소스 파일 (번역 단위). 당신은 그들을 비 강요하는 static그들은 해당 모듈의 다른 부분 (오브젝트 파일)에서 액세스 할 수 있도록. 그러나 이것은 또한 모듈에 더 이상 숨겨 지거나 개인이 아니라는 것을 의미합니다. 외부 연결이 있으면 원래 의도 가 아닌 다른 모듈에서 액세스 할 수 있습니다 .

이름 namespace그것은 또한 특정 소스 파일 (번역 단위)에 대해 정의 외부에서 액세스 할 수 없기 때문에, 하나이 문제를 해결하지 않을 것이다.

일부 namespaceprivate, 즉 그 안에 정의 된 모든 것이 속한 모듈에 의해 내부적으로 사용되도록 지정할 수 있다면 좋을 것 입니다. 물론 C ++에는 "모듈"과 같은 개념이없고 "번역 단위"만 있으며 소스 파일에 밀접하게 바인딩되어 있습니다.


3
어쨌든 해킹과 제한된 솔루션 일 것입니다. 그러나 내부 정적 또는 네임 스페이스 기능을 가진 cpp 파일을 'main'cpp 파일에 포함시킬 수 있습니다. 그런 다음이 '위성'cpp 파일을 빌드에서 제외하면 완료됩니다. 둘 이상의 '주'cpp 파일이 있고 둘 다 '위성'cpp 파일 중 하나에서 멋진 기능을 사용하려는 경우 유일한 문제입니다.
Sergey

정적 함수로 개인 / 보호 / 공용으로 상속을 사용하지 않습니까?
Ali

C ++ 20은 문제를 해결하는 모듈을 소개합니다.
LF

4

C ++ 표준은 섹션 7.3.1.1의 네임 스페이스 네임 스페이스, 단락 2를 읽습니다.

네임 스페이스 범위에서 객체를 선언 할 때는 정적 키워드를 사용하지 않으므로 unnamed-namespace는 탁월한 대안을 제공합니다.

정적은 유형 선언이 아닌 객체, 함수 및 익명 공용체의 이름에만 적용됩니다.


5
아닙니다. 초안했다. 그리고 얼마 지나지 않아 또 다른 초안이이 어리석은 변화를 되돌 렸습니다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.