2013-04-05 1 views
2

사이에 다른 내가 통화 당정적 Mutext이 아닌 정적 뮤텍스

namespapce A 
{ 
    namespace 
    { 
     static CMutex initMutex; 
    } 

    void init() 
    { 
     //code here 
    } 

    void uninit() 
    { 
     //code here 
    } 
} 

의 코드는 내가 뮤텍스의 정적을 제거하면 다른과 정적이있는 경우가? 그리고 정적의 사용은 무엇입니까?

감사합니다.

+0

'네임 스페이스'는 의도적으로 이름이 지정되지 않았습니까? –

+1

나는 이것이 다음과 같은 복제본이라고 생각한다. http://stackoverflow.com/questions/11623451/static-vs-non-static-variables-in-namespace – maditya

+0

예, 익명의 네임 스페이스로 다른 코드에서는 사용할 수 없다. – domlao

답변

2

당신은 C와 C++의 혼합 유형입니다. C 언어의 static 키워드는 변수의 범위를 번역 단위로 좁힐 의도가 있습니다. 번역 단위에서 전역 적으로 정의 할 수 있지만 다른 번역 단위에서는 볼 수 없습니다. 비얀 스트로브 스트 룹 대신 같은 static를 사용하는 C++에서 익명 namespaces를 사용하는 것을 권장하기 The C++ 표준 섹션에서 읽어

7.3.1.1 이름 네임 스페이스 조 제 2 항 말한다

this 포스트에서 C.

에서 :

The use of the static keyword is deprecated when declaring objects 
in a namespace scope, the unnamed-namespace provides a superior alternative. 

정적은 선언을 입력하지 않고 개체, 함수 및 익명 공용체의 이름에만 적용됩니다.

5

뮤텍스가 정적 인 경우 헤더에 있었고 헤더가 2cpp 파일 (2 개의 변환 단위)에 포함되어 있으면 첫 번째 파일의 코드에 적용된 잠금이 두 번째 파일에 표시되지 않습니다. 위험한. 이것은 두 유닛이 뮤텍스의 정적 인 정적을 가지고 있기 때문입니다. 이 경우 전역 뮤텍스가 좋습니다.

이것은 C++ 인 경우 RAII 메커니즘을 사용하여 뮤텍스 잠금 및 잠금 해제를 관리합니다. 이것은 C++입니다. 클래스는 어디에 있습니까? 물건을 클래스로 캡슐화합니다.

RAII의 예 (상황이 클래스로 캡슐화 할 수있는 기본적인 일) : http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

+0

"이것은 C++입니다. 클래스는 어디에 있습니까? 클래스로 물건을 캡슐화합니다." C++은 클래스에 모든 것을 밀어 넣으라고하지는 않지만, 네임 스페이스와 프리 스탠딩 함수는 올바르게 사용된다면 스스로 잘됩니다. –

2

정적 단지 않는 두 가지 :

  • 는 프로그램의 전체 수명을 위해 존재하는 변수 (수 하지만 이것은 전체적인 수준이기 때문에 전체 프로그램 수명 동안 존재하는 모든 것이 있습니다!)

  • 변수는 선언 된 번역 단위에서만 볼 수 있습니다 (그러나 이것은 익명 네임 스페이스).

그래서, 사실,이 특정 상황에서 정적 아무것도하지 않습니다.

관련 문제