1. 전처리기(preprocessor)란?
- 컴파일전에 행해지는 동작을 정의
2. 전처리기의 종류?
- 기호상수
- 매크로
- 전처리기 지시어의 조건적 실행
3. 선언
- #으로 시작, 공백문자만 전처리기 지시어 앞에 나타날 수 잇다.
4. #include
- 특정한 파일의 복사본을 지시어 위치에 포함시킨다.
- <> : 보통 기본 컴파일러의 기본 라이브러리
- "" : 사용자 정의 라이브러리
5. #define(기호상수)
- #define PI 3.14159
- 한번 정의된 기호상수는 본문내에서 변경될 수 있다.
- 범위는 정의된 본문내에서만...
- 추가적인 메모리를 할당 하지 않는다.
6. #define(매크로)
- 매크로도 컴파일 전 치환 텍스트로 변환되어 사용
- 매크로의 인수는 타입과 관계없다. 단지 텍스트를 변환해 줄 뿐이다.
- #define CIRCLE_AREA(x) (PI * (x) * (x))
- #define CIRCLE_AREA(x) (PI * x * x)일 경우 문제가 생길 수 있다.
EX) CIRCLE_AREA(c+2)이면 단순 텍스트 변환이므로
PI * c+2 * c+2가 되므로 연산 우선순위에 의해 *가 먼저 연산이 일어난다.
- 매크로에 의해 함수를 직접 호출하는 방식이 아닌 텍스트 치환으로 이루어지기 때문에 메모리가 덜 쓰여진다는 것이다.
- 매크로가 커지면 치환되는 양이 많아지므로 프로그램이 커진다는 단점이 있다.
- 그러므로 inline함수를 통해 적절한 균형을 잡을 수 있는 케이스라고 할 수 있다.
7. #undef
- define을 해제해준다.
8. #ifdef, ifndef, endif, elif, else, if(조건부 컴파일)
- ifdef(if define), ifndef(if !define), elfi(else if)
9. 미리정의된 기호상수
- __LINE__ : 현재 소스 코드 줄의 줄 번호
- __FILE__ : 파일 이름
- __DATE__ : 컴파일 된 날짜
- __STDC__ : 프로그램이 ANSI C표준을 따르는지 나타냄
- __TIMESTAMP__ : 소스 파일의 최종 변경 날짜와 시간
- __TIME__ : 컴파일 된 시간을 리턴
10. 예제
/*5.cpp*/
/* 전처리기 예제 */
#include <iostream>
/* KILL이 정의되어있지 않으므로
본문에서 에러 발생일어난다. */
#ifdef KILL
#define KILL 0
#endif
/* KILL이 정의되어 있지 않으면
KILL을 0으로 정의한다. */
#ifndef KILL
#define KILL 0
#endif
using std::cerr;
using std::cout;
using std::endl;
int main()
{
int x=3;
/*주석 대신 사용할 수 있는 방법*/
#if 0
cout << "컴파일 되지 않는다." << endl;
#endif
#if 1
cout << "컴파일 된다." << endl;
#endif
/* #ifdef를 DEBUG로 이용하는 방법 */
#ifdef DEBUG
cerr << "Variable is x" << x << endl;
#endif
cout << KILL << endl;
return 0;
}