답변:
기본적으로 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
.
또한 네임 스페이스 범위에서 객체를 선언 할 때는 표준에 따라 정적 키워드를 사용하지 않는 것이 좋습니다.
deprecated
말은 최신 C ++ 0x FCD (n3225)에서 제거 된 것으로 보입니다 .
.cpp
같은 이름으로 클래스를 정의 할 때 연결 문제가 발생 합니다.
이와 관련된 흥미로운 문제가 있습니다.
이 함수는 모듈에서 내부적으로 사용되며 외부에서 액세스 할 수 없으므로 static
키워드 또는 명명되지 않은 namespace
함수를 사용하여 일부 기능을 모듈 (번역 단위) 내부로 만드는 것으로 가정 합니다. (이름없는 namespace
s는 함수 외에도 데이터 및 유형 정의를 내부적으로 만들 수 있다는 이점이 있습니다).
시간이 지남에 따라 모듈 구현의 소스 파일이 커지고이를 여러 개의 개별 소스 파일로 분할하여 코드를보다 효과적으로 구성하고 정의를 더 빨리 찾고 독립적으로 컴파일 할 수 있습니다.
그 기능을 더 이상 할 수 없습니다 :하지만 지금 당신은 문제에 직면 static
하기 때문에, 모듈에 static
실제로 참조하지 않는 모듈 만에 소스 파일 (번역 단위). 당신은 그들을 비 강요하는 static
그들은 해당 모듈의 다른 부분 (오브젝트 파일)에서 액세스 할 수 있도록. 그러나 이것은 또한 모듈에 더 이상 숨겨 지거나 개인이 아니라는 것을 의미합니다. 외부 연결이 있으면 원래 의도 가 아닌 다른 모듈에서 액세스 할 수 있습니다 .
이름 namespace
그것은 또한 특정 소스 파일 (번역 단위)에 대해 정의 외부에서 액세스 할 수 없기 때문에, 하나이 문제를 해결하지 않을 것이다.
일부 namespace
는 private
, 즉 그 안에 정의 된 모든 것이 속한 모듈에 의해 내부적으로 사용되도록 지정할 수 있다면 좋을 것 입니다. 물론 C ++에는 "모듈"과 같은 개념이없고 "번역 단위"만 있으며 소스 파일에 밀접하게 바인딩되어 있습니다.
C ++ 표준은 섹션 7.3.1.1의 네임 스페이스 네임 스페이스, 단락 2를 읽습니다.
네임 스페이스 범위에서 객체를 선언 할 때는 정적 키워드를 사용하지 않으므로 unnamed-namespace는 탁월한 대안을 제공합니다.
정적은 유형 선언이 아닌 객체, 함수 및 익명 공용체의 이름에만 적용됩니다.
static
있습니다.