정적 변수에 대한 extern 링크가없는 이유는 무엇입니까?
왜 않습니다 extern int n
(다른 파일에) 선언 n이 컴파일되지 static int n
하지만, 선언 할 때 작동 int n
? (이 두 선언 모두 파일 범위에 있습니다.)
기본적으로 int n
파일 범위 static int n
가 동일한 범위 와 동일하지 않은 이유는 무엇입니까? 그것은 단지 extern과 관련이 있습니까? 그렇다면 extern은 어떨까요?
의 전체 및 전체 목적은 static
변수가 에서 선언 된 소스 파일에 대해 비공개 임을 선언 하는 것입니다 . 따라서 외부인과의 연결을 막는 역할을 정확하게 수행하고 있습니다.
파일 범위 변수 정의에는 다음과 같은 네 가지 유형이 있습니다.
int blah = 0;
— blah는이 파일에 정의되어 있으며 다른 파일에서 액세스 할 수 있습니다. 다른 파일의 정의가 중복되어 오류가 발생합니다.extern int blah;
— blah는 다른 곳에 정의되어야하며이 파일에서 참조됩니다.int blah;
— 이것은 FORTRAN과 도덕적으로 동등COMMON
합니다. 파일에 이러한 항목을 얼마든지 가질 수 있으며 링커에서 모두 하나의 공유int
. (*)static int blah;
(선택적으로 이니셜 라이저 사용) — 이것은 정적입니다. 이 파일에 대해 완전히 비공개입니다. 그것은 다른 파일에 externs 볼 수 없습니다, 당신은 모든 선언 여러 파일을 가질 수 있습니다static TYPE blah;
, 그들은 모두 서로 다른 .
청중의 순수 주의자 : '파일'= 컴파일 단위 .
정적 내부 함수 (파일 범위가 아님)는 훨씬 더 엄격하게 범위가 지정됩니다. 두 함수 static int bleh = 0;
가 동일한 파일에서도 선언하면 관련이 없습니다.
(*) : 익숙하지 않은 분들을 위해 : 일반적인 패턴에서 하나의 컴파일 단위는 전역 변수를 정의해야하고 다른 단위는이를 참조 할 수 있습니다. 그것은 그 컴파일 단위에 '살아있다'. 위의 경우 (3)의 경우 파일 (또는 모든 파일)이 정의하지 않습니다. 두 파일이라고 말하면 int blah = 0;
링커는 여러 정의에 대해 불평합니다. 두 파일 int blah;
에서 링커가 유쾌하게 단일 전역을 만들고 int
모든 코드가이를 참조하도록합니다.
표준 C에는 함수 외부에서 선언 된 변수에 대한 두 가지 범위가 있습니다. static
변수를 선언 컴파일 단위 (즉, 파일) 내부에서만 볼 수 있으며, 비 정적 변수는 전체 프로그램에서 볼 수 있습니다. extern
선언은 변수의 위치는 아직 알려져 있지 않지만 링커에 의해 정렬됩니다 말한다; 비 정적 변수와 호환되지만 extern static
말도 안됩니다!
물론 요즘에는 다른 가시성이 있습니다. 특히, 단일 소스 파일과 전체 프로그램 사이에 범위 지정 수준이 있습니다. 단일 공유 라이브러리의 수준은 유용합니다 (GCC 함수 속성과 같은 메커니즘을 통해 설정 가능). 그러나 이것은 비 정적 변수의 주제에 대한 변형 일뿐입니다. static
이전과 동일한 해석을 유지합니다.
iv.c : 2 : 1 : 오류 : 선언 지정자의 여러 스토리지 클래스 extern static int i; ^
그것이 우리가 정적 변수를 extern하려고 할 때 얻는 것입니다. extern static int i 선언; -선언 float int i와 유사합니다. 동일한 선언에 float와 int를 표시 할 수 없습니까? 마찬가지로 동일한 선언에 extern 및 static을 사용할 수 없습니다.
MSDN 문서에 따르면 :
변수를 수정할 때 static 키워드는 변수에 정적 기간 (프로그램이 시작될 때 할당되고 프로그램이 종료 될 때 할당 해제 됨)이 있음을 지정하고 다른 값이 지정되지 않는 한 0으로 초기화합니다. 파일 범위에서 변수 또는 함수를 수정할 때 static 키워드는 변수 또는 함수에 내부 연결이 있음을 지정합니다 (해당 이름은 선언 된 파일 외부에서 볼 수 없음).
http://msdn.microsoft.com/en-us/library/s1sb61xd(v=vs.80).aspx : 2013 년 6 월
참조 URL : https://stackoverflow.com/questions/2841762/why-wont-extern-link-to-a-static-variable
'development' 카테고리의 다른 글
남은 시간 계산 (0) | 2021.01.10 |
---|---|
Clojure에서 LazySeq 문자를 문자열로 어떻게 변환 할 수 있습니까? (0) | 2021.01.10 |
특정 길이의 단어와 일치하는 정규식 (0) | 2021.01.10 |
knockout.js에 조건부로 요소 속성 추가 (0) | 2021.01.10 |
목록의 각 항목을 나머지 항목과 한 번만 비교하는 방법은 무엇입니까? (0) | 2021.01.10 |