게임학원, 게임프로그래머 취업 전문 교육기관 DirectX11/12 자체엔진 게임개발과정,서버프로그래밍,자료구조,알고리즘,유니티,언리얼 게임학원, 언리얼학원 Effective C++ 항목2 #define을 쓰려거든 const, enum, inline을 떠올리자
본문 바로가기

Effective C++ 항목2 #define을 쓰려거든 const, enum, inline을 떠올리자

항목 2: #define을 쓰려거든 const, enum, inline을 떠올리자


 “가급적 선행 처리자보다 컴파일러를 더 가까이 하자“


#define ASPECT_RATIO 1.653


ASPECT_RATIO 가 기호식 기호로 보이지만 컴파일러에겐 전혀 보이지 않습니다.


디버그에 어려움이 생긴다 라는 의미로 해석할 수 있습니다.



1. CONST

문제의 해결법은 매크로 대신 상수를 쓰는 것


const double AspectRatio = 1.653




#define을 const화 할 때 주의점 두가지


1-1. 상수포인터를 정의 하는 경우

   포인터는 꼭 const로 포인터가 가리키는 대상까지 const로

        ex) const char* const strName = “ASSORT ROCK”;

        => string이 사용하기 좋다

           ex) const std::string strName = “ASSORT ROCK”;


1-2. 클래스 멤버로 상수를 정의 하는 경우

상수의 사본 개수가 한 개를 넘지 못하게 하고 싶다면 정적(static) 멤버로 만들어야 합니다.

        => 다른공간을 할당하여 이 멤버변수에 접근한다면 static const는

         한 개의 주소만 갖는다.(원본만 갖느다.)


class CPlayer

{

        private:

        static const int m_iCount = 5;

        int m_arrScore[m_iCount ];

}


위에 m_iCount는 선언된 것이고 보통 정의가 마련되어야 하지만

정적 멤버로 만들어지는 클래스 내부 상수는 예외입니다. (선언만 있어도 됩니다.)

단. 클래스 상수의 주소를 구한다든지 컴파일러가 잘못 만들어진 경우는 정의를 제공해야 합니다.

이렇게 정의를 하지만

const int CPlayer::m_iCount;

초기값이 있으면 안됩니다.

클래스 상수의 초기값 선언될 당시에 바로 초기화 된다라는 것입니다.

하지만 오래된 컴파일러는 이 문법을 받아들이지 못하는 경우가 종종 있습니다.


2. ENUM


나열자둔갑술(enum hack)


class CPlayer

{

        private:

        enum { COUNT_MAX = 5 };

        int m_arrScore[ COUNT_MAX ];

}

이 방식은 동작방식이 const보다는 #define에 더가깝습니다.

enum의 주소를 취하는 일은 불법입니다.

 - 다른 사람들이 내가 선언한 상수를 주소 또는 참조자로 사용하는 것을 막을 수 있습니다.

(코딩 방식의 결정을 통해 설계상의 제약을 강화하는 방법 – 항목18)


이런 나열자 둔갑술은 템플릿 메타프로그래밍의 핵심 기법

(항목 48)


3. INLINE

인라인 함수의 템플릿 (항목 30)

기존 매크로의 효율을 그대로 유지함 정규 함수의 모든 동작방식 및 타입 안정성까지

완벽히 취할 수 있는 방법


어떤 함수 f를 호출하는 매크로

#define CALL_WITH_MAX( a, b ) f( (a) > (b) ? (a) : (b) )


int a = 5, b = 0;

CALL_WITH_MAX( ++a, b )  //a가 두 번 증가합니다.

CALL_WITH_MAX( ++a, b + 10 )  //a가 한 번 증가합니다.


define의 문제점


해결

tamplate<typename T>

inline void callWithMax(const T& a, const T& b)(참조자를 사용하는 이유 - 항목 20)

{

        f( a > b ? a : b );

}


위 const, enum, inline를 통해 선행처리자(특히#define)를 최대한 줄여 보자라는 이야기였습니다.


요약 1. 단순상수사용시 const, enum사용

    2. 함수처럼 쓰이는 매크로는 inline함수
















게임프로그래머 취업 전문 교육기관 어소트락 게임아카데미







교대역 / 강남역 근처 프로그래밍 학원










C언어 C++ 특강

자료구조&알고리즘 특강

게임 자체엔진 제작 취업커리큘럼

수많은 학생들 대기업 프로그래머로 취직 넥슨 스마일게이트 등 자부할 수 있습니다.