아래와 같은 C 파일이 있다면 i
과 j
의 차이점은 무엇입니까?정적 대 글로벌
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main()
{
//Some implementation
}
아래와 같은 C 파일이 있다면 i
과 j
의 차이점은 무엇입니까?정적 대 글로벌
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main()
{
//Some implementation
}
i
은 내부 링크가 있으므로 다른 원본 파일 (엄격하게 번역 단위)에 i
이라는 이름을 사용하여 동일한 개체를 참조 할 수 없습니다.
j
에는 외부 연결이 있으므로 다른 번역 단위로 extern
을 선언하면 j
을 사용하여이 개체를 참조 할 수 있습니다.
성능 차이는 있습니까? – ma11hew28
같은 일을하는 경우 컴파일러에서 동일한 코드를 생성 할 수 있으므로 런타임에 차이가 없어야합니다. 전역 범위에서는 컴파일 범위가 더 넓어 컴파일이 약간 더 길어질 수 있습니다. –
은 모듈 외부에서 볼 수 없습니다. j
은 전 세계적으로 액세스 할 수 있습니다.
즉, 여기에 연결된 다른 모듈은
extern int j;
을 다음 읽고 j
의 값을 기록 할 수 있습니다. 동일한 다른 모듈은 i
에 액세스 할 수 없지만 자체 모듈을 선언 할 수 있습니다. 심지어 전역 모듈도 선언 할 수 있습니다.이 모듈은 첫 번째 모듈에서 볼 수 없습니다.
'extern'선언이 필요합니까? –
구현에 따라 다릅니다. 'extern '을 사용하면 한 모듈에 기호가 'extern'이 아니고 public이 할당되어 있으면 문제가 발생하지 않습니다. 초기 Unix 구현은 같은 이름의 심볼을 병합했습니다. 이는 Fortran의 공통점과 같았습니다. 따라서 'extern'은 필요하지 않았습니다. – wallyk
"보이지 않음"이 범위에서 벗어남을 의미하지 않는다는 점에 유의하십시오. 즉, 다른 컴파일 단위에서 i를 선언하고 .c 파일에서 정적 i를 제거하면 전역 파일이 .c 파일에 표시됩니다. 반대로 전역 파일이 범위를 벗어난 경우 .c 파일에 정적 파일을 선언하면 문제가되지 않습니다. 세계적인 것이 결코 보이지 않을 것입니다. 다른 컴파일 단위에서 정의 된 전역 i보다 우선 순위를 갖는 정적 i는 '섀도 잉'이라고합니다. 그것은 또한 함수 locals와 함께 발생하며 C++/c-only 것은 아닙니다. – Jupiter
i
에는 내부 연결이 있고 j
에는 외부 연결이 있습니다. 즉, 연결된 다른 파일에서 j
에 액세스 할 수 있지만 i
은 선언 된 파일에서만 사용할 수 있습니다.
i
은 정적 연결 인 입니다. 즉, 변수는 현재 파일에서만 액세스 할 수 있습니다.
j
가 extern
로 정의되어야한다, 그것은 또 다른 헤더 파일 (.h
)에서
extern int j;
을, 그리고 그것은 외부 링크있을 것이다 및 파일을 통해 액세스 할 수 있습니다.
이 질문에 대한 답변 읽기 : http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar
[정적, 자동, 글로벌 및 로컬 변수 간의 차이점 c 및 C++의 컨텍스트에서]] (https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) –