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

C에서 함수와 변수의 선언과 정의의 차이를 설명하십시오. 다중 모듈 프로젝트에서 이러한 규칙을 위반하면 어떻게 될까요?

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

답변

C 언어에서는 선언 (declaration)과 정의 (definition)를 구분합니다.

  • 선언은 컴파일러에게 함수나 변수의 존재와 타입을 알리지만, 메모리를 할당하지는 않습니다.
  • 정의는 객체나 함수의 본체를 설정하여 실제로 변수에 대한 메모리를 예약하거나 함수 코드를 배치합니다.

예:

// 선언 (extern) extern int global_var; int func(int); // 정의 int global_var = 42; int func(int x) { return x * 2; }

다중 모듈 프로젝트에서는 선언을 헤더 파일에 배치하여 모듈들이 서로에 대해 "알 수 있도록" 하고, 정의는 하나의 소스 파일에만 배치하여 링크 시 충돌을 방지합니다.

함정 질문

같은 변수의 여러 정의가 서로 다른 소스 파일에 있을 수 있습니까 (예: int flag = 0;), 동일한 헤더 파일을 포함하는 경우?

답변: 아니요! 헤더 파일에는 extern int flag;의 선언만 포함되어야 하며, 변수의 정의는 단 하나의 소스 파일(int flag = 0;)에만 있어야 합니다. 이를 지키지 않으면 다중 정의에 대한 링크 오류가 발생합니다.

주제의 미세한 차이에 대한 실제 오류 사례


이야기

대규모 프로젝트에서 전역 변수를 헤더 파일에 int counter = 0;로 "나누었습니다". 이 헤더를 include하여 정의가 중복되는 문제가 발생했습니다. 결과: CI/CD 빌드 시 링크 오류 - "multiple definition of counter".


이야기

함수 라이브러리에서 타입 사양 없이 함수 프로토타입을 작성하여, 컴파일러가 구식 선언으로 판단하고, 후에 모듈 간 함수 시그니처 불일치로 오류를 발생시켰습니다.


이야기

테스트 단계에서 일부 변수가 초기화되지 않았다는 사실이 드러났습니다. 이는 extern으로만 선언되었지만 어떤 모듈에서도 초기화되지 않았기 때문입니다. 이로 인해 쓰레기 값을 읽게 되고, 임베디드 플랫폼에서 복잡한 버그가 발생했습니다.