Declaration: A declaration simply informs the program that a variable/function exists somewhere within the program, providing info about its type (for variables) and its arguments and return type (for functions). Declarations do not allocate memory.
Definition: A definition encompasses everything that a declaration does but goes a step further by allocating memory (for variables) or providing the implementation (for functions). A definition is a superset of a declaration.
가장 큰 차이점: 메모리 할당 여부
2. 문법
extern data_type variable_name;
예시
#include<stdio.h>externint a // extern int var: declaration// int var: declaration + definitionintmain(){
printf("%d", a);
return0;
}
3. 기능 설명 (예시 참조)
extern some_data_type some_variable_name;와 같은 문장을 사용하여 extern 변수 선언 시
변수에 메모리 할당되지 않고 변수의 속성 및 타입을 할당하는 것
이렇게 하는 것은 해당 프로그램 어딘가에 해당 변수가 정의되었다는 것을 컴파일러에게 알려주는 것
같은 파일 내에서 extern 변수를 여러 번 선언하는 것 가능 (반면 automatic/local 변수는 한 번만 선언 가능)
extern 변수의 역할은 현재 파일 외부 어딘가에 해당 변수의 정의 (definition)가 존재한다고 컴파일러에게 알려주는 것
컴파일러는 이 정보에 의지하여 컴파일 실행 시 error을 내지 않음
프로그램 안 다른 어딘가에 해당 변수가 정의되었다는 것을 ensure하는 것은 linker의 책임/역할임
변수의 초기화는 일반적으로 소스 코드 안에서 해당 변수가 초깃값을 (initial value)을 받았을 때 일어남
NOTE: 변수는 여러 번 선언될 수 있지만 한 번만 정의될 수 있음
02 static 키워드란
1. 정의
'정적인'
해당 전역 변수의 사용 범위를 변수를 선언한 소스 파일로 제한하고 싶을 때 사용
→ static 변수로 선언/정의 시 다른 파일에서 extern 키워드로 참조 불가능
→ 같은 이름의 전역 변수를 다른 소스파일에서 선언해도 오류가 발생 안함
→ 해당 소스 파일 내에서만 제한되는 전역 변수
설명 예시)
// example1.cint g_data1 = 0;
staticint g_data2 = 0;
staticint g_data3 = 0;
// example2.cint g_data1; // 오류 발생, 이유: 해당 프로그램 내 같은 이름의 전역 변수 존재int g_data2; // 오류 발생 X, 이유: 별개의 전역 변수externint g_data3; // extern을 통한 참조 불가능