프로그래밍임베디드 C 개발자

C 언어에서 변수의 범위에 대한 세부 사항을 설명하십시오. 범위 오류가 코드의 안정성과 가독성에 미치는 영향은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

응답

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)가 발생하였습니다.