2012-08-17 5 views
7
@interface Foo : NSObject 

{ 
    extern int gGlobalVar; 
    int i; 
} 
-(void)setgGlobalVar:(int)val; 

@end 


@implementation Foo 

-(void)setgGlobalVar:(int)val 
{ 
    i = 5; 
    NSLog(@"i = %i", i); 
    gGlobalVar = val; 
} 

@end 

인터페이스에 i을 선언하고 구현시 오류없이 사용할 수 있습니다. 하지만 인터페이스에 유형 extern 변수를 선언 할 수 없습니다. 이게 왜 그렇게? "유형 이름으로 저장 클래스를 지정할 수 없습니다"라는 오류 메시지가 나타나는 이유는 무엇입니까?타입 이름으로 저장 클래스를 지정할 수 없습니다.

답변

13

짧은 설명 : 의 괄호 부분 클래스의 @interface 또는 @implementation 인스턴스 변수 (일명 "바르")를 선언만을위한 것입니다. extern 키워드는 전역 변수 선언 (또는 함수와 함께 사용하기위한 것이지만 다른 주제입니다.)
따라서 extern ivar를 선언 할 수 없습니다.

껄끄 러운 세부 사항 : 변수는 먼저 선언 된 다음 정의됩니다. 명시 적 정의가없는 로컬 선언 변수는 대개 컴파일러에서 할당되고 기본값이 제공되므로 로컬 범위의 변수에서는 일반적으로이 구분이 흐리게 표시됩니다.

전역 변수는 범위가 전역을 알고 있으면 모든 범위에서 잠재적으로 사용할 수 있습니다. 여기에 extern 키워드가 들어 있습니다. 에 글로벌 변수가 존재한다고 선언하고 으로 정의되었습니다. 다른 코드 파일의 전역 변수에 액세스하려는 경우에만 유용합니다.

모범 사례 : 당신의 책은 구현 파일에 extern 변수 (. 예를 들어 "하는 .m"파일 등) ... 그 일을 할 수 선언 몇 가지 코드를 가지고 있지만, 당신이이기 때문에 그것은 나쁜 습관이다 그 글로벌이 실제로 다른 곳에서 유효한 정의를 가지고 있는지에 대한 잠재적 인 나쁜 가정을합니다. (그러나 멋진 컴파일러는 이러한 유형의 오류를 발견 할 것입니다.) 대신에 헤더 파일에 extern 변수를 한 번 선언하고 해당 헤더의 extern을 정의하는 데 사용되는 구현 파일을 가지고있는 것이 가장 좋습니다. 그런 다음 해당 전역 변수를 사용하려는 다른 구현 파일에 해당 헤더를 포함하십시오.

+0

귀하의 회신에 감사드립니다 HachiEthan. 우연히도, 내가 언급하고있는 책은 '.m'파일에 'extern'을 사용했다. –

+0

@Rut 약간의 연구를하고 있습니다. 이전에 extern의 핵심을 파고 들지 않았습니다. (그리고 현재 작업하면서 도움이 될 것입니다.) 곧 답변을 업데이트 할 것입니다. =) – MechEthan

+0

정말 고맙습니다 HachiEthan! –

관련 문제