"가능하면 전처리기보다는 컴파일러를 가까이 하자"
#define ASPECT_RATIO 1.653
#define을 사용하면
=> 매크로 대신 상수를 사용하도록 한다.
const double AspectRatio = 1.653;
class GamePlayer
{
private :
int scores[클래스 상수 필요];
}
컴파일러가 정적 클래스 상수에 대한 클래스 내 초기화를 허락하지 않는다면
enum을 정적 상수 대신 사용하는 방법
class GamePlayer
{
private :
enum
{
NumTurns = 5;
}
int scores[NumTurns];
}
- 나열자 둔갑술은 const보다는 #define에 가깝다. (컴파일 타임에 처리되긴 하지만 상수 리터럴이고, 주소를 가지지 않음)
- 이 나열자 둔갑술은 템플릿 메타 프로그래밍의 핵심 기법이기도 하다.
#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는 한 번 증가한다.
// 문제가 발생할 수 있다.
=> 기존 매크로의 효율의 유지 + 정규 함수의 동작방식 및 타입 안전성까지 취할 수 있는 함수 템플릿을 사용하도록 한다.
template <typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}