2010-02-16 4 views
48

아래와 같은 C 파일이 있다면 ij의 차이점은 무엇입니까?정적 대 글로벌

#include <stdio.h> 
#include <stdlib.h> 

static int i; 
int j; 

int main() 
{ 
    //Some implementation 
} 
+1

이 질문에 대한 답변 읽기 : http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar

+0

[정적, 자동, 글로벌 및 로컬 변수 간의 차이점 c 및 C++의 컨텍스트에서]] (https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) –

답변

44

i은 내부 링크가 있으므로 다른 원본 파일 (엄격하게 번역 단위)에 i이라는 이름을 사용하여 동일한 개체를 참조 할 수 없습니다.

j에는 외부 연결이 있으므로 다른 번역 단위로 extern을 선언하면 j을 사용하여이 개체를 참조 할 수 있습니다.

+7

성능 차이는 있습니까? – ma11hew28

+0

같은 일을하는 경우 컴파일러에서 동일한 코드를 생성 할 수 있으므로 런타임에 차이가 없어야합니다. 전역 범위에서는 컴파일 범위가 더 넓어 컴파일이 약간 더 길어질 수 있습니다. –

17

은 모듈 외부에서 볼 수 없습니다. j은 전 세계적으로 액세스 할 수 있습니다.

즉, 여기에 연결된 다른 모듈은

extern int j; 

을 다음 읽고 j의 값을 기록 할 수 있습니다. 동일한 다른 모듈은 i에 액세스 할 수 없지만 자체 모듈을 선언 할 수 있습니다. 심지어 전역 모듈도 선언 할 수 있습니다.이 모듈은 첫 번째 모듈에서 볼 수 없습니다.

+1

'extern'선언이 필요합니까? –

+1

구현에 따라 다릅니다. 'extern '을 사용하면 한 모듈에 기호가 'extern'이 아니고 public이 할당되어 있으면 문제가 발생하지 않습니다. 초기 Unix 구현은 같은 이름의 심볼을 병합했습니다. 이는 Fortran의 공통점과 같았습니다. 따라서 'extern'은 필요하지 않았습니다. – wallyk

+1

"보이지 않음"이 범위에서 벗어남을 의미하지 않는다는 점에 유의하십시오. 즉, 다른 컴파일 단위에서 i를 선언하고 .c 파일에서 정적 i를 제거하면 전역 파일이 .c 파일에 표시됩니다. 반대로 전역 파일이 범위를 벗어난 경우 .c 파일에 정적 파일을 선언하면 문제가되지 않습니다. 세계적인 것이 결코 보이지 않을 것입니다. 다른 컴파일 단위에서 정의 된 전역 i보다 우선 순위를 갖는 정적 i는 '섀도 잉'이라고합니다. 그것은 또한 함수 locals와 함께 발생하며 C++/c-only 것은 아닙니다. – Jupiter

4

i에는 내부 연결이 있고 j에는 외부 연결이 있습니다. 즉, 연결된 다른 파일에서 j에 액세스 할 수 있지만 i은 선언 된 파일에서만 사용할 수 있습니다.

3

i은 정적 연결 인 입니다. 즉, 변수는 현재 파일에서만 액세스 할 수 있습니다.

jextern로 정의되어야한다, 그것은 또 다른 헤더 파일 (.h)에서

extern int j; 

을, 그리고 그것은 외부 링크있을 것이다 및 파일을 통해 액세스 할 수 있습니다.

관련 문제