C언어로 작성된 코드는 일반적으로 전처리(Preprocess), 컴파일(Compile), 어셈블(Assemble), **링크(Link)**의 과정을 거쳐 바이너리로 번역됩니다.
아래의 예제 코드를 이용하여 각 단계에 대해 자세히 알아보겠습니다.
// Name: add.c
#include "add.h"
#define HI 3
int add(int a, int b) { return a + b + HI; } // return a+b
// Name: add.h
int add(int a, int b);
**전처리(Preprocessing)**는 컴파일러가 소스 코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 과정입니다.
언어마다 조금씩 다르지만, 컴파일 언어의 대부분은 다음의 전처리 과정을 거칩니다.
1. 주석 제거
주석은 개발자가 자신과 개발자들의 코드 이해를 돕기위해 작성하는 메모입니다. 주석은 프로그램의 동작과 상관이 없으므로 전처리 단계에서 모두 제거됩니다.
2. 매크로 치환
#define으로 정의한 매크로는 자주 쓰이는 코드나 상숫값을 단어로 정의한 것입니다. 전처리 과정에서 매크로의 이름은 값으로 치환됩니다.
3. 파일 병합
일반적인 프로그램은 여러 개의 소스와 헤더 파일로 이루어져 있습니다. 컴파일러는 이를 따로 컴파일해 합치기도 하지만, 어떠한 경우는 전처리 단계에서 파일을 합치고 컴파일하기도 합니다.
오른쪽의 add.i는 add.c를 전처리한 결과입니다. gcc에서는 -E 옵션을 사용하여 소스 코드의 전처리 결과를 확인할 수 있습니다. 결과를 살펴보면 먼저 소스 코드의 주석이었던 // return a+b가 사라졌고, HI가 3으로 치환되었습니다. 그리고 add.h의 내용이 #include에 의해 병합되었습니다.