전처리기(Preprocessor)는 소스 코드가 컴파일러를 거치기 전에 먼저 처리하는 프로그램입니다. 전처리기는 '#' 기호로 시작하는 전처리기 지시문(명령)에 따라 동작하며, 컴파일 이전 단계에서 매크로 치환, 파일 포함 등 다양한 작업을 수행합니다.
전처리기 명령의 세 가지 종류
매크로 치환 지시문(Macro Substitution Directives)
파일 포함 지시문(File Inclusion Directives)
컴파일러 제어 지시문(Compiler Control Directives)
1. 매크로 치환 지시문
매크로 치환 지시문은 코드 내에서 특정 식별자(identifier)가 나타날 때마다 이를 미리 정의해 둔 문자열로 자동으로 대체하는 기능입니다. 상수를 의미 있는 이름으로 관리하거나 간단한 함수 형태의 매크로를 만들 때 유용하게 사용됩니다.
매크로를 정의하는 기본 문법은 다음과 같습니다.
#define 식별자 문자열
예를 들어 다음과 같이 작성할 수 있습니다.
#define PI 3.1415 /* 원주율 상수 정의 */ #define f(x) x * x /* 함수형 매크로 정의 */ #undef PI /* 정의된 매크로 PI 해제 */
예제 코드
#define wait getch()
main() {
clrscr();
printf("Hello");
wait;
}위 예제에서 'wait'라는 식별자는 getch()로 치환되므로, wait; 부분은 실제로 getch(); 로 바뀌어 실행됩니다.
실행 결과
Hello
2. 파일 포함 지시문
#include 지시문을 사용하면 함수 선언이나 매크로 정의가 담긴 외부 파일(헤더 파일)을 현재 소스 코드에 포함시킬 수 있습니다. 표준 라이브러리 함수를 사용할 때 필수적인 지시문입니다.
기본 문법은 다음과 같습니다.
#include <파일명> #include "파일명"
꺾쇠 괄호(< >)를 사용하면 시스템 표준 헤더 디렉터리에서 파일을 찾고, 큰따옴표("")를 사용하면 현재 작업 디렉터리를 우선하여 파일을 찾습니다.
예제 코드
#include <stdio.h>
main() {
printf("Hello");
}실행 결과
Hello
위 예제에서 printf() 함수의 원형(정의)은 <stdio.h> 헤더 파일에 포함되어 있으므로, 해당 파일을 #include로 불러와야 정상적으로 컴파일됩니다.
3. 컴파일러 제어 지시문
C 전처리기는 '조건부 컴파일(Conditional Compilation)'이라는 강력한 기능을 제공합니다. 이를 활용하면 프로그램 내의 특정 코드 라인 또는 라인 그룹을 선택적으로 컴파일에 포함시키거나(ON) 제외시킬(OFF) 수 있습니다. 주요 지시문으로는 #if, #else, #elif, #endif, #ifdef, #ifndef 등이 있습니다.
예제 코드
#define LINE 1
#include <stdio.h>
main() {
#ifdef LINE
printf("this is line number one");
#else
printf("This is line number two");
#endif
}위 예제에서는 LINE이 #define으로 정의되어 있으므로 #ifdef 조건이 참이 되어, 첫 번째 printf 문만 컴파일됩니다.
실행 결과
this is line number one