전처리기는 프로그램 번역의 첫 단계에서(컴파일 전) 전처리 명령문들을 처리하는 텍스트 프로세서이다. 프로그래밍 중에 가장 빈번하게 사용되는 전처리 명령문은 소스 파일에 다른 소스 파일의 내용을 그대로 복사해 주는 #include이다.

프로그래밍 개발 순서로 봤을때 전처리시점은 아래와 같다.

소스작성 -> 전처리(Preprocess) -> 컴파일 -> 링크 -> 실행파일 생성


전처리기는 전처리 지시자, 전처리 연산자, 미리정의된 전처리 매크로, Pragma 지시자로 이루어져 있다.

------------ 전처리 지시자(Preprocessor Directives)


1. #define, #undef

#define은 매크로 함수를 정의하거나 소스 코드 내에서 매크로 상수를 정의 하는데 사용된다.

 

먼저 다음과 같이 정의된 매크로 함수는

#define plus(a,b) (a)+(b)

소스코드에서 다음과 같이 사용될 경우

int sum = plus(1,2);

전처리기에 의해 아래와 같이 확장되어 sum에는 3이 대입된다.

int sum = 1 + 2;

 

다음으로 매크로 상수는 다음과 같은 형식으로 정의한다.

#define MAX 100

소스코드에서 if(i < MAX)라고 사용될 경우 전처리시에 MAX가 100으로 확장된다.

 

 #undef는 #define로 정의된 매크로 상수/함수를 해제하는데 사용된다.

#undef plus

#undef MAX

라고 사용하면 더 이상 코드내에서 사용할 수 없다.

  

2. #if, #elif, #else, #endif

쉽게 전처리기용 if....else if...else 문이라고 생각할 수 있다.

#if와 #endif는 반드시 짝을 이루어서 사용되어야 하고, #elif는 #if와 #endif사이에 원하는 횟수만큼 사용가능하며, #else를 사용할 경우에는 반드시 #endif 앞에서 한번만 사용 가능하다.

  

3. #ifdef, #ifndef

#if와 #elif가 불린 표현식을 평가하는데 비해 이 지시자는 매크로 상수의 정의여부를 평가한다.

#ifdef는 평가하고자 하는 매크로상수가 정의 되어 있을때 TRUE가 되고, #ifndef는 정의 되어 있지 않을때 TRUE가 된다.

#ifdef _DEBUG는 #if defined(_DEBUG)와 같은 의미이다.

 

 4. #include

이 지시자는 소스코드 첫부분에 빠지지 않고 등장하는 지시자이다. 특정 소스코드의 내용을 현재 지시자 위치에 단순히 복사해주는 기능을 가지고 있다.

#include <stdio.h>

#include "userDefinedClass.h"

위와 같이 두개의 형식으로 사용할 수 있는데, 기능은 동일하지만 전치리기가 헤더파일을 찾는 순서에 차이가 있다. <>를 사용하는 경우 컴파일러 옵션 /I로 설정된 경로에서 찾아본 후, 미리 정의된 헤더파일 경로(VC++ Directories)에서 찾아보고, 파일을 발견하지 못할 경우 에러를 발생시킨다. ""를 사용한 경우에는 #include를 사용된 소스파일과 같은 디렉토리에서 찾아본 후, 포함하려는 파일이 마지막이나 처음으로 열렸던 위치에서 찾아본다. 나머지 과정은 <>경우와 동일하다. 전체 경로명을 사용할 경우에는 위와 같은 방법을 따르지 않고 사용된 그 경로에서만 헤더파일을 찾는다.

 

 5. #line

컴파일러가 내부적으로 유지하고 있는 라인번호와 파일이름을 변경한다.

test.h 파일 7번 라인에서

__FILE__와 __LINE__ 매크로를 사용해서 출력해보면 test.h, 7로 나오지만

같은 파일에서

#line 100 "change.h"와 같이 매크로를 실행하면 컴파일 내부적으로 유지되고 있던 라인번호와 파일이름이 100과 change.h로 변경된다.

 

 6. #error

fatal error를 발생시키고 전처리과정을 중단한다.

#ifndef MAX

#error You must define MAX!!!

#endif

위와 같은 코드가 있고 MAX라는 매크로 상수가 정의 되어 있지 않은 경우에 컴파일을 실행해보면 #error 매크로에 의해 아래와 같은 오류가 발생하면서 컴파일이 중단된다.

오류 1 fatal error C1189: #error :  You must define MAX!!! 

d:\works\projects\appwizard\appwizardview.cpp 18

 

 ------------ 전처리 연산자(Preprocessor Operators)

전치리기에 제공되는 연산자는 아래의 4개가 있고 각 연산자의 설명은 링크로 대신한다.

Charizing operator (#@) http://blog.naver.com/kky0317/120102466296

Stringizing operator (#)  http://blog.naver.com/kky0317/120102466093

Token-pasting operator (##)  http://blog.naver.com/kky0317/120102466602

defined operator : 매크로 상수의 정의 여부를 평가해준다.

  

------------ 미리정의된 매크로 상수(Predefined Macros)

1. __DATE__ : 현재 소스 파일의 컴파일 날짜

2. __FILE__ : 파일 이름

3. __LINE__ : 라인 번호

4. __TIME__ : 가장 최근의 컴파일 시간

5. __TIMESTAMP__ : 마지막 변경된 날짜와 시간

위의 매크로 상수들을 출력해 보면 아래와 같은 결과가 나온다.(TRACE() 매크로로 디버그 출력창에 출력)



※ 출처 : http://blog.naver.com/kky0317?Redirect=Log&logNo=120102467877

by 민트앤라떼 2011. 4. 19. 13:19