전처리기는 소스 파일의 텍스트를 조작하는 텍스트 처리기이다. 전처리기는 소스 파일을 구문 분석하지 않으나 토큰으로 구분하여 매크로 호출을 찾는다. 컴파일러는 일반적으로 첫 번째 단계에서 전처리기를 호출하지만 컴파일하지 않고 텍스트를 처리하기 위해 전처리기를 별도 호출할 수도 있다.
전처리기 지시문은 일번적으로 소스 프로그램을 쉽게 변경하고 여러 실행 환경에서 쉽게 컴파일하는데 사용된다. 각 지시문은 특정 작업을 수행하도록 전처리기에 지시한다. 전처리기는 텍스트에서 토큰을 대체하거나 다른 파일의 내용을 소스 파일에 삽입하거나 소스코드의 부분을 제거하여 컴파일되지 않도록 할 수 있다. 전처리기 코드 줄은 컴파일과정에서 매크로가 실제 코드로 대체되기 전 인식되고 수행된다. 따라서 매크로가 전처리 명령과 같이 보이는 항목으로 확장되면 전처리기에서 인식되지 않는다.
전처리기는 다음 지시문으로 분류된다.
- 파일 처리를 위한 전처리문:
#include
- 형태 정의를 위한 전처리문:
#define
,#undef
- 조건 처리를 위한 전처리문:
#if
,#ifdef
,#ifndef
,#else
,#elif
,#endif
- 에러 처리를 위한 전처리문:
#error
- 디버깅을 위한 전처리문:
#line
- 컴파일 옵션 처리를 위한 전처리문:
#pragram
지시문 | 설명 |
---|---|
#define | 식별자 또는 매개 변수화된 식별자와 토큰 문자열을 연결하는 매크로 만듬 |
#error | 컴파일 시간에 사용자 지정 오류메시지를 내보낸 다음 컴파일을 종료 |
#import | 형식 라이브러리의 정보를 통합하는데 사용 |
#undef | #define 으로 만든 이름을 제거 (정의 해제) |
#if | 소스 파일의 부분에 대한 컴파일을 제어한다. #if ?? 의 ?? 에 0이 오면 #if 다음 블럭을 컴파일하지 않음 |
#else | #else 는 #if 와 함께 사용되는 것으로 #if 지시어의 조건이 만족되지 않을 때 수행할 코드가 있는 경우 사용 |
#elif | #if 와 함께 사용되며 #if 조건 외 다른 조건을 적용 시킬 때 사용 |
#endif | 조건부 컴파일의 시작 지시문인 #if 와 #ifdef 과 쌍으로 조건 블록의 끝을 나타내기 위해 사용 |
#include | 소스파일에 include 다음에 명시된 파일을 소스파일에 추가하기 위해 사용 |
#ifdef | 식별자가 #define 으로 정의되었는지 검증하고 다음 소스코드를 컴파일 할 때 사용 |
#ifndef | ``#ifdef``` 에 의해서 확인된 조건의 반대인 경우를 확인하기 위해 사용 |
#pragma | 컴파일러에게 직접 명령을 내릴 때 사용, 각각의 컴파일러마다 독립적인 기능을 제공하기 위해 사용 |
#line | 프로그램 소스의 줄 번호와 파일 이름을 변경할 때 사용하며 지시문 바로 다음에 오는 줄의 값을 설정할 때 사용 |
다음 코드는 #define
, #ifndef
, else
, endif
를 사용한 프로그램 코드로 화면에 Normal
에 출력된다.
#define DEBUG
문은 DEBUG
라는 식별자를 정의한 것이고
#ifndef DEBUG
문은 DEBUG
라는 식별자가 정의되지 않는 경우를 확인하는 것으로 앞에서 DEBUG
가 정의되어 있기 때문에
이 조건문의 결과는 false 가 되어 cout << str2 << endl;
가 실행되지 않는다.
#else
는 #ifndef #else #endif
구조의 else
에 해당하는 것으로 DEBUG
라는 식별자가 정의된 경우를
조사하는 것으로 지금 코드에서 DEBUG
라는 식별자가 정의되어 있기 때문에
cout << str1 << endl;
가 실행된다.
#include <iostream>
using namespace std;
#define DEBUG
int main(int argc, char const *argv[])
{
string str1 = "Normal";
string str2 = "Error";
#ifndef DEBUG
cout << str2 << endl;
#else
cout << str1 << endl;
#endif
return 0;
}
코드의 실행 결과는 다음과 같다.
Normal