컴파일러가 컴파일을 하기 전에 처리하는 명령문
주요 전처리기
<…>, “…” (전자는 표준 라이브러리 경로에서 탐색하며, 후자는 현재 디렉토리 → 시스템 라이브러리 경로 순으로 탐색)#define, #undef#if, #elif, #else, #endif#ifdef, #ifndef인클루드 가드(include guard)
#ifndef C_H
#define C_H
#include "c.h"
#endif
static_cast : 우리가 흔히 생각하는, 언어적 차원에서 지원하는 일반적인 타입 변환
const_cast : 객체의 상수성(const)를 없애는 타입 변환
reinterpret_cast : 서로 관련이 없는 포인터들 사이의 캐스팅 등 위험을 감수하고 하는 캐스팅
dynamic_cast : 파생 클래스 사이에서의 다운 캐스팅
다운 캐스팅은 dynamic_cast로, 업 캐스팅은 const_cast로 이루어지며, 단 다운 캐스팅 시 해당 클래스는 사전에 업 캐스팅된 객체이어야 함
Derived* derived = new Derived();
Base* base = static_cast<Base*>(derived); // 업캐스팅 (안전)
// 다운 캐스팅: Base → Derived (단, base는 실제로 Derived 객체였음)
Derived* casted = dynamic_cast<Derived*>(base); // OK
// ------------------------------------------------------------------------ //
// 잘못된 경우: Base 객체 자체를 Derived로 캐스팅하려 하면 실패
Base* plain_base = new Base();
Derived* bad_cast = dynamic_cast<Derived*>(plain_base); // nullptr 반환