static (파일/모듈 수준):
static으로 선언된 변수와 함수의 가시성은 컴파일 모듈(파일)로 제한됩니다.extern:
중요: static은 구현을 숨기기 위해 사용되고, extern은 모듈 간의 연결을 위해 사용됩니다.
예:
main.c:
static int hidden_var = 5; extern int shared_var; int main() { printf("shared %d", shared_var); }
shared.c:
int shared_var = 10;
다른 파일에서 hidden_var를 사용하려고 하면 링킹 오류가 발생합니다.
static/extern와 같은 이름의 변수를 다른 모듈에서 다른 명세자와 함께 정의하면 어떻게 됩니까?
답변: 각각의 static 변수(예: static int foo;는 서로 다른 파일에서)는 완전히 독립적인 객체입니다. extern int foo; 선언은 이름이 foo인 공유 전역 변수를 찾습니다. static과 extern을 혼합할 수 없습니다 — 이는 하나의 파일에서 foo가 static으로 정의되고 다른 파일에서 extern으로 선언된 경우 링킹 오류를 발생시킵니다.
이야기 프로젝트에서 다른 모듈에 동일한 이름의 함수(정적 없이)가 중복되어 발견되었습니다: 링커는 그 중 하나만 연결했고, 다른 하나는 "사라졌습니다", 이는 애플리케이션의 논리에 영향을 미쳤습니다.
이야기 큰 프로젝트에서 두 모듈에 전역 변수
int counter;가 두 번 선언되었지만 둘 다 extern 없이 선언되었습니다. 그 결과 애플리케이션의 동작은 링킹 순서에 따라 달라졌고, 때때로 충돌하는 기호가 발생했습니다.
이야기 모듈이 잘못된 가시성으로 함수를 사용했습니다: 그것은 static으로 정의되었고, 개발자는 다른 소스에서 호출을 시도했으며, 모디파이어를 extern으로 변경하지 않으면 프로그램이 컴파일되지 않았습니다 (또는 static을 제거하지 않으면).