본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

전처리기(Preprocessor, 선행처리기)는 컴파일러가 원시 프로그램을 번역하기 전에 매크로 확장, 다른 파일 포함, 조건부 컴파일 같은 글자 단위 처리를 먼저 해 주는 프로그램이다.

대표적인 것이 C 언어의 전처리기다. # 으로 시작하는 줄(전처리 지시자)을 읽어 처리하고, 그 결과로 지시자가 모두 풀린 원시 코드를 컴파일러에 넘긴다. GCC 에서 gcc -E 로 전처리 결과만 볼 수 있다.

전처리기는 문법을 따지지 않고 글자를 바꿔 넣을 뿐이다. 원시 프로그램을 토큰으로 나누는 어휘 분석, 문법을 검사하는 구문 분석은 그 뒤에 컴파일러가 한다.

번역 과정에서의 위치

편집 원본 편집
단계 하는 일 결과
전처리 매크로 확장, 헤더 파일 포함, 조건부 컴파일, 주석 제거 전처리된 원시 코드(.i)
컴파일 어휘 분석 → 구문 분석 → 의미 분석 → 코드 생성 어셈블리 코드(.s)
어셈블 어셈블리를 기계어로 목적 파일(.o, .obj)
링크 목적 파일과 라이브러리를 묶는다 → 링커 실행 파일

C 언어의 전처리 지시자

편집 원본 편집
지시자 하는 일
#include 지정한 헤더 파일의 내용을 그 자리에 끼워 넣는다
#define / #undef 매크로를 정의하거나 해제한다
#if #ifdef #ifndef #elif #else #endif 조건에 따라 코드 일부만 컴파일한다
#pragma 컴파일러에 따라 다른 지시를 준다
#error 전처리 중에 오류를 내고 멈춘다
#include <stdio.h>
#define SQUARE(x) ((x) * (x))   /* 괄호가 없으면 SQUARE(a+1) 이 a+1*a+1 이 된다 */

int main(void) {
#ifdef DEBUG
    printf("debug build\n");
#endif
    printf("%d\n", SQUARE(3));  /* 전처리 뒤에는 ((3) * (3)) */
    return 0;
}

매크로는 함수 호출이 아니라 글자 치환이라 인자를 괄호로 감싸지 않으면 연산 순서가 틀어진다.

다른 전처리기

편집 원본 편집
  • 내장 SQL 의 프리컴파일러는 호스트 언어 안의 SQL 문을 함수 호출로 바꾼 뒤 컴파일러에 넘긴다
  • 웹의 CSS 전처리기(Sass, Less)는 변수·중첩 문법을 일반 CSS 로 바꾼다