C 언어 · 컴파일 단위

헤더, 소스, extern 연결 구조

여러 C 파일이 따로 컴파일된 뒤 링커에서 하나의 실행 파일로 묶일 때 선언, 정의, 외부 참조가 어떤 단계에서 해결되는지 분리한다.

01

헤더 포함

전처리기가 include 내용을 각 소스 파일에 펼쳐 컴파일 입력을 만든다.

preprocess
02

단위 컴파일

file1.c와 file2.c는 서로 독립된 목적 파일로 변환된다.

translation unit
03

심볼 수집

각 목적 파일의 정의 심볼과 미해결 외부 참조가 표로 정리된다.

symbol table
04

주소 연결

링커가 extern 참조를 실제 정의 위치에 묶고 중복 정의를 검사한다.

link
extern int x;
선언만 있는 상태 저장 공간을 만들지 않고 다른 파일의 정의를 기대한다.
참조 가능
int x;
전역 변수 정의 한 프로젝트 안에서 하나의 실제 저장 공간을 만든다.
중복 리스크
static int x;
파일 내부 심볼 다른 파일에서 같은 이름을 써도 별개의 내부 연결 이름으로 처리된다.
internal linkage

오류 해석 기준

undefined reference 선언은 보였지만 링크 단계에서 실제 정의를 찾지 못했다.
multiple definition 동일한 외부 심볼 정의가 둘 이상 발견됐다.
header guard 같은 헤더가 한 컴파일 단위에 중복 포함되는 문제를 막는다.