프로그래밍C 개발자

C 언어에서 변수와 함수에 대한 static과 extern의 차이를 설명하십시오. 가시성이 모듈 구성에 어떤 영향을 미칩니까?

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

답변

  • 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을 제거하지 않으면).