가급적 선행 처리자보다 컴파일러를 더 가까이 하자!
#define ASPECT_RATIO 1.653
소스코드가 컴파일러에게 넘어가기 전에 선행 처리자가 ASPECT_RATIO를 숫자 상수로 바꿨기 때문에, 컴파일러에겐 ASPECT_RATIO가 전혀 보이지 않는다. (->컴파일러가 쓰는 기호 테이블에도 없다.)
때문에 파일 에러라도 발생한다면 소스 코드에서는 ASPECT_RATIO이지만, 에러 메시지엔 1.653만 보이게 된다.
또한 코드에 존재하는 모든 ASPECT_RATIO를 1.653으로 바꾸기 떄문에 1.653의 사본이 등장 횟수만큼 들어간다.
const double AspectRatio=1.653;
이렇게 매크로 대신 상수를 쓰면 AspectRatio는 컴파일러에도, 기호 테이블에서도 보이게 된다.
또한 사본이 딱 한 개만 생기게 된다.
const char * const authorName="Scott Meyers"; // C 스타일 상수 포인터
const std::string authorName("Scott Meyers"); // C++ 스타일, char*보다 추천
class GamePlayer {
private:
static const int NumTurns=5; // 선언 O 정의 X, 선언은 헤더 파일에 정의는 구현 파일에
int scores[NumTurns];
}
※구식 컴파일러 대응법은 추후 작성 예정
#define CALL_WITH_MAX(a, b) f((a)>(b)?(a):(b)) // 매크로는 인자마다 반드시 괄호 필요
int a=5, b=0;
CALL_WITH_MAX(++a, b); // a가 2번 증가
CALL_WITH_MAX(++a, b+10); // a가 1번 증가
인자마다 괄호를 씌워야 하며 위와 같은 괴현상을 만날 수 있다.
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a>b ? a:b);
}
인자에 괄호를 씌우지 않아도 되며, 인자를 여러 번 평가할지도 모른다는 걱정도 없다.
또한 매크로가 아니므로 유효 범위와 접근 규칙을 그대로 따라간다.