정적 vs 글로벌
나는 다음과 같은 C 파일이있는 경우의 차이 무엇 i
과 j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
i
내부 연결이 있으므로 i
다른 소스 파일 (엄격히 번역 단위)에서를 사용 하여 생성 된 이름 을 참조 할 수 없습니다 .
j
외부 연결이 있으므로 다른 번역 단위에서 j
선언하는 경우이 개체를 참조하는 데 사용할 수 있습니다 extern
.
i
모듈 외부에서는 설명합니다. j
전 세계적으로 액세스 할 수 있습니다.
즉, 링크 된 다른 모듈은
extern int j;
에서 값을 읽고 쓸 수 있습니다 j
. 동일한 다른 모듈이에 액세스 할 수 없지만 i
첫 번째 모듈에는 표시되지 않는 전역 인스턴스라도 자체 인스턴스를 선언 할 수 있습니다.
차이점은 i
내부 연결 j
이 외부 연결이 것입니다. 즉 j
, 된 다른 파일-link에서 액세스 할 수 있지만 i
선언 된 파일에서만 사용할 수 있습니다.
i
정적 연결 을 갖습니다 . 즉, 현재 파일에서만 액세스 할 수 있습니다.
j
로 정의되어야합니다 extern
. 즉
extern int j;
다른 외부 헤더 파일 ( .h
)에있는 경우에있는 경우 파일간에 액세스 할 수 있습니다.
다른 소스의 일부로 파일을 포함 했음에도 불구하고 정적 변수 / 함수의 범위는 파일 복제가 있습니다.
전역 변수의 범위는 포함 된 파일 전체입니다. 다른 소스 파일에 변수를 extern
선택하기 전에 사용 합니다. 이 경우 변수에 대해 메모리가 다시 할당되지 않습니다.
extern
정의하지 않고 C 변수를 선언하는 데 사용됩니다. extern
키워드는 C 변수 및 C 함수의 가시성을 확장합니다. 함수는 기본적으로 프로그램을 통해 볼 수 있으므로 함수 extern
선언 / 정의에 사용할 수 없습니다. 그 사용은됩니다.
참고 URL : https://stackoverflow.com/questions/2271902/static-vs-global
'ProgramingTip' 카테고리의 다른 글
HTML 속성 이름에 허용되는 문자는 무엇입니까? (0) | 2020.11.18 |
---|---|
C # 변수 범위 지정 : 'x'는 'x'에 다른 의미를 부여 할 수 없습니다. (0) | 2020.11.18 |
Java로 여러 인터페이스 구현-위임하는 방법이 있습니까? (0) | 2020.11.18 |
scanf ()는 버퍼에 새 줄 문자를 남깁니다. (0) | 2020.11.18 |
bash를 호출하고 새 셸 내에서 명령을 실행 한 다음 사용자에게 제어권을 다시 제공하는 방법은 무엇입니까? (0) | 2020.11.18 |