scope는 이름이 보이는 범위이고, 저장 기간은 값이 메모리에 살아 있는 기간입니다. C의 local, static, extern은 이 둘을 섞어 읽으면 바로 헷갈립니다.
- 지역 변수 주소를 반환해도 되는지 다시 확인하고 싶다
static이 함수 안과 파일 범위에서 왜 다르게 느껴지는지 정리하고 싶다extern이 선언인지 정의인지 한 번에 구분하고 싶다
숏컷 코드
c
static int file_only = 0;
void counter(void) {
static int calls = 0;
calls++;
}문법
지역 변수는 함수 안에서만 이름이 보이고, 함수가 끝나면 값도 사라집니다.
c
void f(void) {
int local = 0;
}그래서 지역 변수 주소를 함수 밖으로 넘기는 코드는 위험합니다. scope와 저장 기간이 둘 다 짧기 때문입니다.
저장 기간
함수 안 static은 이름은 함수 안에만 보이지만 값은 호출 사이에도 유지됩니다.
c
void counter(void) {
static int calls = 0;
calls++;
}파일 범위 static은 이 파일 안에서만 접근 가능한 전역처럼 동작합니다.
c
static int helper_count = 0;extern은 다른 파일에 있는 정의를 가져다 쓸 때 씁니다.
c
/* state.c */
int g_count = 0;
/* main.c */
extern int g_count;수명 이해
- 지역 변수는 함수 종료와 함께 사라집니다.
- 함수 안
static은 이름은 지역이지만 값은 호출 사이에 유지됩니다. - 파일 범위
static은 이 파일 안에서만 보이는 숨은 전역에 가깝습니다. - 공유 전역은 한 곳에서 정의하고, 다른 파일은
extern선언만 둡니다. - 헤더에 전역 변수 정의를 넣으면 링크 단계에서
multiple definition이 나기 쉽습니다.
주의할 점
함수 안 static 변수는 편하지만 숨겨진 전역 상태처럼 동작할 수 있습니다. 테스트, 재진입성, 스레드 안전성이 중요해지는 순간 갑자기 부담이 커질 수 있으니 "호출 간 상태 보존"이 정말 필요한지 먼저 보는 편이 좋습니다.
참고 링크
1 sources