글
전처리기는 프로그램 번역의 첫 단계에서(컴파일 전) 전처리 명령문들을 처리하는 텍스트 프로세서이다. 프로그래밍 중에 가장 빈번하게 사용되는 전처리 명령문은 소스 파일에 다른 소스 파일의 내용을 그대로 복사해 주는 #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
'P rogramming > C Language' 카테고리의 다른 글
time() - 시스템 시간값 가져오기 (0) | 2011.06.16 |
---|---|
Malloc(동적 메모리 할당) vs Array(배열) (0) | 2011.06.01 |
바이트 순서 변환 함수 (ntohl, ntohs, htonl, htons) (0) | 2011.04.13 |
execl(), execv() - 프로세스 생성 (3) | 2011.04.05 |
fork() - 프로세스 생성 (1) | 2011.03.28 |
RECENT COMMENT