주소

2014-06-13 3 views
0

내가 (나는 아이폰 OS 개발자입니다) C에서 큰 아니에요 호출 그래서 이것은 하나의 나를 혼란 : 나는 약간의 현지화를 정의하는 헤더 파일을 가지고주소

을 도우미 :

#ifndef LocalizationMacros_h 
#define LocalizationMacros_h 

static NSString * forcedLanguage = nil; 

static inline void forceLanguage(NSString*language){ 
    NSLog(@"Forcing language %@ (%i)", language, &forcedLanguage); 
    // Output: Forcing language de (5248160) 

    forcedLanguage = language; 
} 

static inline NSString * translate(NSString * language, NSString * key){ 
    NSLog(@"Forced language: %@ (%i)", forcedLanguage, &forcedLanguage); 
    // Output: Forced language: (null) (5248236) 

    // ... do some stuff to put translation into result ... 
    return result; 
} 

#endif 

이해가되지 않는 이유는 값으로 (null) 결과 forceLanguage()translate() 사이 forcedLanguage 변화의 주소. 누군가가 나를 계몽 할 수 있습니까?

+1

필자는'inline'이 각 컴파일 단위에 로컬로 별도의 정적을 생성하게한다고 추측합니다. 서로 다른 컴파일 단위에 두 가지 방법이 있습니까? –

답변

2

static 키워드는 개체가 배치 된 번역 단위에 개체를 현지화합니다.이 개체를 헤더 파일에 배치하면 여러 번역 단위에 포함될 수 있습니다.

여기서 static은 연결 수정 자로 사용됩니다. 이 문맥에서는 저장소 클래스 지정자가 아닙니다. 함수 외부에서 선언 된 모든 데이터는 어떤 경우에도 정적 저장소 클래스를 갖습니다. 여기서 원하는 것은 글로벌하게 만드는 것입니다 (권장 사항이 아닌 사실). 즉 extern 연결을 제공하는 것입니다. 외부 링크는 extern을 선언하는지 여부에 관계없이 기본값입니다.

외부 링키지를 제공하는 경우 머리글에는 인스턴스화가 아닌 선언 만 포함해야합니다. 인스턴스화는 단일 번역 단위에 있어야합니다.

+0

'번역 단위'와 반대로 '편집 단위'를 의미합니까? 나는 두 가지가 모두 좋다고 할지라도이 대답을 받아 들일 것이라고 생각한다. –

+0

편집 단위/번역 단위 - 그들은 같은 것입니다. http://en.wikipedia.org/wiki/Translation_unit_(programming) – Clifford

+0

하, 감사합니다. 내가 C에 대해 얼마나 많이 알고 있는지 보여줍니다! –

4

헤더가 포함 된 모든 소스 파일에 대해 forcedLanguage 변수의 복사본을 정의합니다.

static NSString * forcedLanguage = nil; 

에 : 헤더 변화에

extern NSString * forcedLanguage; 

다음 하나 개의 소스 파일 (헤더에 해당하는 이상적 일)에 정의

향후 참조를 위해
NSString * forcedLanguage = nil; 

, 경험치 규칙은 다음과 같습니다. 변수 선언 헤더 파일, 변수 정의 소스 파일을 입력하십시오.