Quick Reference
scope는 이름을 쓸 수 있는 범위이고, storage duration은 객체가 살아 있는 기간입니다. static은 위치에 따라 수명 또는 linkage를 제한하며, extern은 다른 파일의 정의를 선언합니다.
/* 현재 .c 파일에서만 이름을 쓴다. */
static int file_only = 0;
void counter(void) {
int local = 0; /* block을 벗어나면 수명이 끝난다. */
static int calls = 0;
calls += ++local; /* 프로그램이 끝날 때까지 값을 유지한다. */
}
extern int configured_limit; /* 다른 .c 파일에 있는 정의를 선언한다. */static은 함수 안에서는 수명을 늘리고, 파일 범위에서는 외부 파일에서 그 이름을 못 보게 합니다. 그래서 scope, lifetime, linkage를 같은 뜻으로 섞지 않습니다.
문법
지역 변수는 함수 안에서만 이름이 보이고, 함수가 끝나면 값도 사라집니다.
void f(void) {
int local = 0;
}그래서 지역 변수 주소를 함수 밖으로 넘기는 코드는 위험합니다. scope와 저장 기간이 둘 다 짧기 때문입니다.
scope는 이름을 어디서 쓸 수 있는지, linkage는 같은 이름이 다른 translation unit와 연결되는지, storage duration은 객체가 언제 생성·소멸하는지입니다. 세 개를 같은 뜻으로 읽지 않아야 static과 extern을 정확히 고를 수 있습니다.
저장 기간
함수 안 static은 이름은 함수 안에만 보이지만 값은 호출 사이에도 유지됩니다.
void counter(void) {
static int calls = 0;
calls++;
}파일 범위 static은 이 파일 안에서만 접근 가능한 전역처럼 동작합니다.
static int helper_count = 0;extern은 다른 파일에 있는 정의를 가져다 쓸 때 씁니다.
/* state.c */
int g_count = 0;
/* main.c */
extern int g_count;extern int g_count;는 선언이고, 초기화가 붙은 file-scope int g_count = 0;는 하나의 정의입니다. 헤더에는 보통 extern 선언만 두고 정의는 정확히 한 .c 파일에 둡니다. static storage duration 객체는 프로그램 시작 전에 0으로 초기화됩니다.
수명 이해
- 지역 변수는 함수 종료와 함께 사라집니다.
- 함수 안
static은 이름은 지역이지만 값은 호출 사이에 유지됩니다. - 파일 범위
static은 이 파일 안에서만 보이는 숨은 전역에 가깝습니다. - 공유 전역은 한 곳에서 정의하고, 다른 파일은
extern선언만 둡니다. - 헤더에 전역 변수 정의를 넣으면 링크 단계에서
multiple definition이 나기 쉽습니다.
주의할 점
함수 안 static 변수는 편하지만 숨겨진 전역 상태처럼 동작할 수 있습니다. 테스트, 재진입성, 스레드 안전성이 중요해지는 순간 갑자기 부담이 커질 수 있으니 "호출 간 상태 보존"이 정말 필요한지 먼저 보는 편이 좋습니다.
참고 링크
2 sources