C에서 변수는 다양한 범위를 가질 수 있습니다: 지역(블록 내), 전역(파일 전체) 및 파일 내 범위(static). 범위 관리는 작업의 예측 가능성과 이름 충돌 방지를 위해 중요합니다.
전역 변수는 파일 내 모든 함수에서 사용할 수 있으며, extern으로 선언된 경우 프로젝트 전체에서 사용 가능합니다.
지역 변수는 블록(예: 함수 또는 루프)에 들어갈 때 생성됩니다. 선언된 블록 외부에서는 보이지 않습니다.
static int foo; — 현재 파일에서만 사용 가능합니다.
예:
static int counter = 0; // 파일 내에서만 사용 void increment() { int temp = 10; // 지역 변수 ++counter; }
만약 전역 변수와 지역 변수가 같은 이름을 가지고 있다면, 함수 내에서는 어떤 변수가 사용되며 그 이유는 무엇입니까?
응답: 지역 변수가 사용됩니다. 이는 지역 변수가 자신의 범위 내에서 전역 이름을 "가리는"(shadowing) 때문입니다. 전역 변수는 지역 변수가 선언된 블록 외부에서 여전히 접근 가능합니다.
예:
int value = 5; void foo() { int value = 10; printf("%d", value); // 10이 출력되며, 5는 출력되지 않음 }
이야기
이야기
static 지정을 잊어버렸습니다. 이로 인해 링크 시 이름 충돌이 발생했고, 프로젝트의 다른 부분을 컴파일할 때 예측할 수 없는 오류가 생겼습니다.이야기
전역 변수가 적절한 동기화 없이 다중 스레드 코드에서 사용되는 경우도 있었습니다. 암묵적인 범위와 다양한 스레드에서 값을 변경할 때의 부주의로 인해 데이터 레이스(data race)가 발생하였습니다.