#define ASPECT_RATIO 1.653
ASPECT_RATIO 가 Symbolic Name 처럼 보일 수 있지만 Proprocessor 가 Source Code 를
Complier 에게 넘기기 전에 숫자 상수로 바꾸기 때문에 Compiler 의 Symbol Table 에 들어가지 않는다.
이에 따라 Complie Error 가 나타난다면 Source Code 엔 ASPECT_RATIO 로 되어있지만 Error Message 에는 1.653 이 있어 오류를 찾는데 시간이 들 수 있다.
const double AsseptRatio = 1.653;
AsseptRatio 는 상수 타입이기 때문에 Complier 의 Symbol Table 에 들어간다.
Macro 를 사용하게 되면 AsseptRatio 가 나오는 경우 마다 1.653 의 사본이 Object Code 안에 들어가게 되지만 상수 타입은 여러번 나오게 되더라도 사본이 단 한개만 생기기 때문에
Compile 을 거친 최종 Code Size 가 #define 을 쓸 경우보다 적게 나올 수 있다.
#define 을 const 로 교체할 시 대게 Header File 에 정의하여 #include 를 통하여 사용하는데
Pointer 와 같은 경우 반드시 const 를 붙여야 하며 가리키는 대상까지 const 를 해줘야 한다.const DataType* const Name = Address;
Constant Member 의 사본 개수가 한 개를 넘기지 못하게 하고 싶다면 Static Member 로 선언한다.
class GamePlayer { private : static const int NumTurns = 5; // 상수 선언 int scores[NumTurns]; ... }
해당 NumTurns 는 Declaration 된 것인데 ( definition 이 아님. )
C++ 에서는 사용하고자 하는 것에 대한 Definition 이 이루어져 있어야 한다.
하지만 Static Member 로 만들어지는 정수류 타입의 Class 내부 Constant 는 예외이다.
단 , Class Constant 의 Address 를 구할 때나 Complier 에 의해 Definition 이 필요할 때는 별도의 Definition 을 제공 해야 한다.const int GamePlayer::NumTurns;
이 때 Constant 의 Definition 은 Header File 이 아닌 구현 File 에 두어야 한다.
Constant Member 와 같은 경우 상수가 서언된 시점에서 바로 주어지기 때문에
Definition 에는 Constant 의 초기값이 없어야 한다.
Constant Mebmer 를 가지고 #define 을 만들게 되면 유효 범위가 존재하지 않기 때문에
사용이 불가능하며 어떤 형태의 캡슐화 혜택도 받을 수 없다.
class GamePlayer { private : enum { NumTurns = 5 }; int Scores[NumTurns]; }
Enum back 기법은 나열자 타입의 값은 int 가 놓은 곳에도 쓸 수 있다는 C++ 의
진실을 적극 활영한 기법이다.
#define 의 주소와 enum 의 주소를 취하는 것이 불가능한 것 처럼
enum 같은 경우 Static Constant Member 보다는 #define 에 더 가까운 기법이다.
그렇기 때문에 자신이 선언한 정수 상수를 가지고 다른 이가 주소나 참조를 쓴다는 것을 방해할 수 있다.
Enum back | 나열자 둔갑술
// 매크로 인자들중 큰 것을 이용하여 f 를 호출하는 MacroFunction #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
int a = 5, b = 0; CALL_WITH_MAX(++a, b); CALL_WITH_MAX(++a, b + 10);
위 와 같은 Macro Function 은 a 가 f 가 호출되기 전에 증가하는 횟수가 달라진다.
Inline Function 을 사용한다면 함수의 모든 동작방식과 안정까지 취할 수 있다.
template<class T> inline void callWithMax(const T & a, const T & b) { f(a > b ? a : b); }
Constant 를 사용할 때 #define 보다 const object 혹은 enum 을 우선 생각하자.
Function 처럼 쓰이는 Marco 를 만들려면 #define Macor 보다 Inline Function 을 생각하자