전처리기(Pre-processor)는 소스 코드가 컴파일러를 통과하기 전에 이를 먼저 처리하는 프로그램입니다. 전처리기는 다양한 명령줄, 즉 지시문(directive)의 제어에 따라 동작합니다.
전처리기 지시문은 일반적으로 main 함수 앞의 소스 프로그램에 위치하며, 첫 번째 열(column)에서 # 기호로 시작하고 문장 끝에 세미콜론(;)을 붙이지 않는다는 점이 일반 코드와 다릅니다.
자주 사용되는 전처리기 지시문은 다음과 같습니다.
- #define
- #undef
- #include
- #ifdef
- #endif
- #if
- #else 등
전처리기 지시문은 용도에 따라 크게 세 가지 범주로 나눌 수 있습니다.
- 매크로 치환 지시문(Macro Substitution Directive)
- 파일 포함 지시문(File Inclusion Directive)
- 컴파일러 제어 지시문(Compiler Control Directive)
매크로 치환 지시문(Macro Substitution Directive)
매크로 치환 지시문은 특정 식별자(identifier)를 지정된 문자열로 대체하는 기능입니다. 상수 정의나 간단한 함수 형태의 매크로를 만들 때 유용하게 활용됩니다.
구문(Syntax)
#define identifier string
예제
단순 매크로: #define MAX 500
인수가 있는 매크로: #define sqrt(x) x*x
중첩 매크로:
#define A 10 #define B A+1
위 예제에서 B는 A+1, 즉 10+1로 치환되어 사용됩니다.
파일 포함 지시문(File Inclusion Directive)
파일 포함 지시문은 외부 파일의 내용을 현재 소스 파일에 그대로 삽입할 때 사용됩니다. 주로 헤더 파일을 불러올 때 활용됩니다.
구문(Syntax)
#include "filename" 또는 #include <filename>
예를 들면 다음과 같습니다.
#include <stdio.h> #include "FORM.C"
<> 꺾쇠 괄호를 사용하면 컴파일러가 표준 라이브러리 디렉터리에서 헤더 파일을 찾고, 큰따옴표("")를 사용하면 현재 작업 디렉터리에서 해당 파일을 먼저 검색합니다.
컴파일러 제어 지시문(Compiler Control Directives)
컴파일러 제어 지시문은 컴파일러의 동작을 직접 제어할 수 있게 해주는 지시문입니다. C 전처리기는 조건부 컴파일(conditional compilation) 기능을 제공하며, 이를 활용하면 프로그램 내 특정 줄 또는 줄 그룹을 조건에 따라 켜거나 끌 수 있습니다.
대표적인 예로 #ifdef와 #ifndef가 있으며, 이들은 특정 매크로가 정의되어 있는지 여부에 따라 코드 블록의 컴파일 여부를 결정합니다. 디버깅 코드나 플랫폼별 코드를 관리할 때 매우 유용합니다.