c++

전처리 단계

코드망령 2026. 5. 20. 09:05

전처리 단계 (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 조건문 종료

'c++' 카테고리의 다른 글

스택프레임  (0) 2026.05.19
힙과 스택 영역  (0) 2026.05.19
메모리 4영역  (0) 2026.05.19