전처리 단계 (Preprocessing)
컴파일 전에 소스 코드를 가공하는 단계
전처리기(Preprocessor)가#으로 시작하는 전처리 지시어를 처리함.
- 소스 코드의 주석이 제거됨
#include,#define,#ifdef등의 지시어를 처리함- 실제 컴파일 전에 코드가 치환되고 정리됨
전처리 지시어 종류
1. #include
헤더 파일 포함 지시어
#include <iostream>
#include "Player.h"
의미
해당 파일의 내용을 현재 소스 코드 위치에 그대로 복사함.
즉,
#include "Player.h"
는 실제로는 Player.h 내부 코드가 현재 파일에 삽입되는 것과 같음.
목적
코드 재사용
여러 파일에서 공통 코드를 재사용 가능
#include "Math.h"
모듈화
- 헤더 파일(
.h)에는 선언 - 소스 파일(
.cpp)에는 구현
으로 분리하여 관리 가능
// Player.h
class Player
{
public:
void Move();
};
// Player.cpp
void Player::Move()
{
}
타입 선언 및 매크로 공유
특정 선언이나 매크로를 여러 파일에서 공통으로 사용 가능
조건부 컴파일 지시어
특정 조건에 따라 코드를 포함하거나 제외함.
종류
#ifdef#ifndef#if#else#endif
#endif
조건부 컴파일 영역 종료
#ifdef DEBUG
cout << "Debug Mode";
#endif
#ifdef
지정한 매크로가 정의되어 있으면 코드 포함
#ifdef DEBUG
cout << "디버그 모드" << endl;
#endif
의미
DEBUG가 정의되어 있으면 실행- 정의되어 있지 않으면 제거됨
#ifndef
지정한 매크로가 정의되어 있지 않으면 코드 포함
#ifndef DEBUG
#define DEBUG 0
#endif
주 사용 목적
헤더 파일 중복 포함 방지
#ifndef PLAYER_H
#define PLAYER_H
class Player
{
};
#endif
#if
조건식이 참일 경우 코드 포함
#if defined(DEBUG) && !defined(RELEASE)
// 내용
#endif
참고
defined()사용define()아님
#else
이전 조건이 거짓일 경우 실행
#ifdef DEBUG
cout << "디버그";
#else
cout << "릴리즈";
#endif
#define
매크로 정의 지시어
상수 매크로
#define PI 3.14
사용 시:
float radius = PI;
↓
float radius = 3.14;
로 치환됨
함수형 매크로
#define SQUARE(x) ((x) * (x))
사용:
SQUARE(3 + 1)
↓
((3 + 1) * (3 + 1))
괄호를 사용하는 이유
문자열 치환 방식이라 괄호가 없으면 연산 우선순위 문제가 발생할 수 있음.
잘못된 예시
#define SQUARE(x) x * x
SQUARE(3 + 1)
↓
3 + 1 * 3 + 1
결과: 7
올바른 예시
#define SQUARE(x) ((x) * (x))
결과: 16
조건부 매크로
#define DEBUG
#ifdef DEBUG
// 내용
#endif
정리
| 지시어 | 역할 |
|---|---|
#include |
파일 내용을 포함 |
#define |
매크로 정의 |
#ifdef |
매크로가 정의되어 있으면 포함 |
#ifndef |
매크로가 정의되어 있지 않으면 포함 |
#if |
조건식이 참이면 포함 |
#else |
이전 조건이 거짓일 때 포함 |
#endif |
조건문 종료 |