2014-04-14 3 views
2

내 .m 파일의 맨 위에는 전통적으로 const int varWidth = 42; 또는 이와 유사한 파일이 있습니다. 공개하기를 원하면 내 .h에 extern const int varWidth을 추가합니다.내 const는 언제 Objective-C에서 정적이어야합니까?

그러나 this link을 읽은 후에는 .m 파일에서만 사용되는 경우 (정적 인 경우가 아니라면) 정적이 미리 추가되는 것이 좋습니다. 왜 이런거야?

static이라는 것은 일단 초기화 될 것이고 그 값은 프로그램의 전체 실행을 위해 지속될 것이라는 것을 의미하지만, 어쨌든 const 인 경우 그게 얼마나 중요한지는 모르겠다.

+1

함수 수준 범위에서 '정적'은 평생 한정어가됩니다. 최상위 스코프에서 '정적'은 내부 연결을 나타냅니다. – CodaFi

답변

1

최상위 범위에있는 변수의 경우 static은 변수에 내부 연결이 있음을 의미합니다. 따라서 동일한 이름을 가진 정적 변수를 선언하는 두 개의 파일은 각각 충돌하는 대신 자체의 변수를 갖습니다.

+0

정적이없는 최상위 변수가있는 두 개의 클래스가있는 경우 충돌이 발생합니다. 어떻게 그렇게? –

+0

@DougSmith : 글쎄, 같은 전역 변수에 대해 여러 개의 정의를 가질 수 있습니다. C는이를 허용하지 않으므로 오류 또는 정의되지 않은 동작이 발생합니다. – Chuck

0

오브젝티브 C는 static 글로벌 만이 선언 된 파일 내 눈에 보이는 변수입니다. 당신은 여기에 대한 자세한 내용을보실 수 있습니다하게 C에서 C로 정도로 static 전역 변수 같은 것을 의미, C의 상위 집합입니다 : C 상대의 언어 What does “static” mean in a C program?

+0

가져 오더라도? –

+0

@DougSmith : 변수를 가져 오지 않습니다. '# import'는 명명 된 파일의 텍스트를'# import'가 나타나는 곳으로 복사하는 컴파일러 지시자입니다. 정적 변수 선언을 포함하는 파일을 가져 오면,'# import' 대신에 다른 정적 변수 선언을 만들 것입니다. – Chuck

2

(목표 C 그들 중 하나), 정적 스토리지 클래스 지정은정보를 숨기기 위해 주로 사용된다.

변수 선언 앞에 static 키워드를 붙이면 내부 연결로 표시합니다. 내부 링크는 여러 식별자가 다른 번역 단위 (C에서는 번역 단위가 C 전처리기에 의해 처리 된 후 소스 파일 임)에 나타나더라도 다른 식별자를 참조 함을 의미합니다. 다시 말하면 내부 링크가있는 식별자는 선언 된 번역 단위에서만 볼 수 있습니다.

다른 번역 단위의 엔티티가 소스 파일의 특정 식별자를 알지 못하도록하려면이 코드를 사용해야합니다. 상수에 따라 엔티티가 많지 않은 경우 프로그램의 영향을 최소화하면서 원하는대로 변경할 수 있습니다.

+0

내부 연결에 대한 귀하의 묘사는 당신이 말하고자했던 것과 반대라고 생각합니다. 내부 링크가있는 식별자는 다른 번역 단위의 * 여러 가지를 참조합니다. – Chuck

+0

@Chuck 네, 맞아요. –

관련 문제