함수 정의와 기호 선언이라는 두 가지 개별 개념을 구별해야합니다. "extern"은 링키지 수정 자이며, 나중에 참조되는 심볼이 정의 된 위치에 대한 컴파일러의 힌트입니다 (힌트는 "여기서는 안됩니다").
내가 쓰면
extern int i;
C 파일의 파일 범위 (함수 블록 외부)에서 "변수가 다른 곳에서 정의 될 수 있습니다"라고 말합니다.
extern int f() {return 0;}
함수 f의 선언과 함수 f의 정의입니다. 이 경우 정의는 extern을 대체합니다.
extern int f();
int f() {return 0;}
먼저 선언 다음에 정의가옵니다.
extern
파일 범위 변수를 선언하고 동시에 정의하려는 경우 사용 이 잘못되었습니다. 예를 들어
extern int i = 4;
컴파일러에 따라 오류 또는 경고가 표시됩니다.
extern
변수의 정의를 명시 적으로 피하려는 경우 사용법 이 유용합니다.
설명하겠습니다 :
ac 파일에 다음이 포함되어 있다고 가정 해 봅시다.
#include "a.h"
int i = 2;
int f() { i++; return i;}
파일 ah는 다음을 포함합니다 :
extern int i;
int f(void);
bc 파일에는 다음이 포함됩니다.
#include <stdio.h>
#include "a.h"
int main(void){
printf("%d\n", f());
return 0;
}
헤더의 extern은 링크 단계에서 컴파일러에게 "정의가 아니라 선언"이라고 알려주기 때문에 유용합니다. i를 정의하고 공간을 할당하고 값을 할당하는 ac 행을 제거하면 프로그램이 정의되지 않은 참조로 컴파일하지 않아야합니다. 이것은 개발자에게 변수를 참조했지만 아직 정의하지 않았다고 알려줍니다. 반면에 "extern"키워드를 생략하고 int i = 2
행을 제거 하면 프로그램이 여전히 컴파일됩니다. 기본값은 0으로 정의됩니다.
파일 범위 변수는 함수 상단에 선언하는 블록 범위 변수와 달리 명시 적으로 값을 지정하지 않으면 기본값 0 또는 NULL로 암시 적으로 정의됩니다. extern 키워드는 이러한 암시 적 정의를 피하므로 실수를 피할 수 있습니다.
함수의 경우 함수 선언에서 키워드는 실제로 중복됩니다. 함수 선언에는 암시 적 정의가 없습니다.