00 개요
- C 언어 파일 및 SWIG 인터페이스 파일에서 등장해서 정리하고자 함
01 extern 키워드란
1. 정의
- 'external' '외부적인'
- 어느 한 파일에서 다른 파일에 정의된(defined) 변수/함수(variable or function)을 참조할 때 사용
- 즉, 다른 파일에 있는 전역 함수를 참조하는 것
1) Declaration vs Definition (선언과 정의)
- 참조: 2024.06.24 - [C] - Declaration vs Definition (선언과 정의)
- 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>
extern int a // extern int var: declaration
// int var: declaration + definition
int main() {
printf("%d", a);
return 0;
}
3. 기능 설명 (예시 참조)
- extern some_data_type some_variable_name;와 같은 문장을 사용하여 extern 변수 선언 시
- 변수에 메모리 할당되지 않고 변수의 속성 및 타입을 할당하는 것
- 이렇게 하는 것은 해당 프로그램 어딘가에 해당 변수가 정의되었다는 것을 컴파일러에게 알려주는 것
- 같은 파일 내에서 extern 변수를 여러 번 선언하는 것 가능 (반면 automatic/local 변수는 한 번만 선언 가능)
- extern 변수의 역할은 현재 파일 외부 어딘가에 해당 변수의 정의 (definition)가 존재한다고 컴파일러에게 알려주는 것
- 컴파일러는 이 정보에 의지하여 컴파일 실행 시 error을 내지 않음
- 프로그램 안 다른 어딘가에 해당 변수가 정의되었다는 것을 ensure하는 것은 linker의 책임/역할임
- linker가 extern 변수와 매칭되는 정의를 찾지 못할 경우 error 발생시킴
- extern 변수가 초기화되면(initialized) 메모리가 할당되며 정의(defined)되었다고 간주됨
- 변수의 초기화는 일반적으로 소스 코드 안에서 해당 변수가 초깃값을 (initial value)을 받았을 때 일어남
- NOTE: 변수는 여러 번 선언될 수 있지만 한 번만 정의될 수 있음
02 static 키워드란
1. 정의
- '정적인'
- 해당 전역 변수의 사용 범위를 변수를 선언한 소스 파일로 제한하고 싶을 때 사용
- → static 변수로 선언/정의 시 다른 파일에서 extern 키워드로 참조 불가능
- → 같은 이름의 전역 변수를 다른 소스파일에서 선언해도 오류가 발생 안함
- → 해당 소스 파일 내에서만 제한되는 전역 변수
- 설명 예시)
// example1.c
int g_data1 = 0;
static int g_data2 = 0;
static int g_data3 = 0;
// example2.c
int g_data1; // 오류 발생, 이유: 해당 프로그램 내 같은 이름의 전역 변수 존재
int g_data2; // 오류 발생 X, 이유: 별개의 전역 변수
extern int g_data3; // extern을 통한 참조 불가능
1) Local vs Global Variable (지역 vs 전역 변수)
- 참조: 2024.06.24 - [C] - Local vs Global Variable (지역 vs 전역 + static 변수)
- Local Variable (지역 변수): 특정 블록 { }에서 선언된 변수, 블록 내에서만 사용 가능하며 메모리 stack영역에 저장됨
- Global Variable (전역 변수): 프로그램 모든 곳에서 쓰이며 메모리 data영역에 저장됨
- Static 지역 / 전역 변수:
- static 지역 변수: 함수 내에서 선언되어 함수 호출이 끝나도 값을 유지함
- static 전역 변수: 다른 전역 변수와 마찬가지로 프로그램이 종료될 때까지 값을 유지함
- static 변수: 선언된 블록에서만 사용 가능, 다른 함수나 블록에서는 접근 불가, 전역 변수와 마찬가지로 초깃값을 지정하지 않으면 0으로 초기화됨
2) static 변수의 저장공간 (Storage)
- C 언어에서 static 변수는 BSS 또는 DATA 영역에 저장됨
- BSS 영역은 초기화되지 않은 데이터를 저장함
- DATA 영역은 초기화된 데이터를 저장함
2. 문법
// variable
static data_type variable_name
data_type static variable_name
// function()
static function_type function_name()
function_type static function_name()
- 예시
// 변수
int static callCount = 0;
static int callCount = 0;
// 함수
static void count()
{
...
}
void static count()
{
...
}
3. 기능 설명
1) Static 변수 예제
- Static 변수를 사용하지 않은 경우:
#include <stdio.h>
int non_static(void) {
int cnt = 0;
cnt++;
return cnt;
}
int main(void) {
printf("%d\n", non_static());
printf("%d\n", non_static());
return 0;
}
- 위 소스코드 및 결과값 설명:
- non_static() 함수 안에 cnt라는 지역 변수가 선언되었으며, 이는 main() 함수에서 non_static() 함수를 호출할 때 비로소 메모리에 할당되며 초기화됨
- 이후 cnt++ 문을 통해 cnt 변수의 값은 1이 되며, 그 1을 출력하게 됨
- Static 변수를 사용한 경우:
#include <stdio.h>
int static_test(void) {
static int cnt = 0;
cnt++;
return cnt;
}
int main(void) {
printf("%d\n", static_test());
printf("%d\n", static_test());
return 0;
}
- 위 소스코드 및 결과값 설명:
- static이라는 문구가 static_test () 함수 내에 선언된 변수 앞에 추가됨 → 이는 정적 변수로 선언되었음을 의미하며 이는 첨파일 시 아예 메모리에 할당됨
- cnt 변수는 프로그램이 종료되기 전까지 메모리의 자리를 차지함
참조
- (extern 키워드란) https://www.skillvertex.com/blog/extern-keyword-in-c/#extern-keyword-in-c
- (static 키워드란) https://velog.io/@sunw9/2-2.-extern-static-const-키워드-알아보기
- (static 키워드 - 2. 문법) https://www.c-programming-simple-steps.com/static-keyword-in-c.html#:~:text=The%20static%20keyword%20in%20C%20is%20a%20storage%2Dclass%20specifier,current%20file%20(compilation%20unit).
- (static 키워드 - 3. 기능 설)
'C' 카테고리의 다른 글
자료형 종류 (C 언어) (0) | 2024.06.24 |
---|---|
Local vs Global Variable (지역 vs 전역 + static 변수) (0) | 2024.06.24 |
Declaration vs Definition (선언과 정의) (0) | 2024.06.24 |
typedef (자료형 별칭 부여 키워드) (0) | 2024.06.21 |
strcpy() strcpy_s() (문자열 복사 함수) (0) | 2024.06.21 |