2. define을 쓰려거든 const, enum, inline 을 사용하자.

부제 : 가금적 선행 처리자보다 컴파일러를 더 가까이 하라.

1. define 보다는 const 를 사용하자.

#define ASPECT_RATIO 1.653 보다는

const int ASPECT_RATIO=1.653 이 났다.

왜일까?

1) 디버그에서 define 은 값으로 변해서 알 수 없지만, const 는 값을 알 수 있다.

2) ASPECT_RATIO 의 주소값등이 필요할 때 사용할 수 없다.

 

* define 대신에 const 를 쓸 때 주의할 경우

1) 포인터는 꼭 const 로 사용하고, 그 대상도 const로 선언하자.

const char * const authorName = “Scott Meyers”;

const std::string authorName(“Scott Meyers”); <- 이것도 괜찮은 방법

2) 클래스 상수 정의

* define 은 유효 범위가 전체다( #undef 로 삭제는 가능 )

* 클래스 상수는 클래스 내에서만 영향을 미친다.

class GamePlayer
{
    public:
        static const int NumTurns = 5; <—지금까지 되는지 몰랐다.
        int Scores[NumTurns];             <—최근 컴파일러에서 가능
};

* 나열자 둔갑술

const 대신에 enum 사용

enum{ NumTurns = 5 };
int Scores[NumTurns];

* enum 은 define 에 가까움, 주소 얻기 불가능, 메모리 할당 없음
* const 도 원래 메모리 할당이 없어야 하지만, 구식 컴파일러라면 잘못 할당 할지도 모른다.

2. 매크로 함수보다는 inline 을 이용하자.

#define CALL_WITHMAX(a,b)    { ( (a) > (b) ) ? (a) : (b) }

이고 a 는 5, b = 0 일 때

CALL_WITHMAX( ++a, b ) 와

CALL_WITHMAX( ++a, b+10)  의 동작에서

전자는 a가 2가 증가, 후자는 1만 증가한다.

* 이유는? MACRO에서는 a의 값이 아니라 ++a 자체로 들어가므로 a > b 인

경우에는 ++a 가, 두번 실행된다.

inline 함수라면 이미 값이 넘어가므로 문제 없음.