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


#define 

컴파일러가 쓰는 기호 테이블에 들어가지 않는다. 

숫자 상수로 대체된 코드에서 컴파일 에러라도 발생하게 되면 꽤나 햇갈릴수 있다.

소스 코드는 기호로 되어 있지만, 에러 메시지엔 상수로 되어있다.


문제 해결법으로는 매크로 대신 상수를 쓰는 것이다.

const double AspectRatio = 1.653;


매크로를 사용하면 선행 차리자에 의해 모두 바뀌면서 결국 목적 코드 안에 1.653의 사본이 등장 횟수만큼 들어간다. 상수 타입은 아무리 여러 번 쓰이더라도 사본은 딱 한 개만 생긴다.


#define을 상수로 교체할 떄 조심할 점

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

 : 포인터는 꼭 const로 선언해 주어야 하고, 포인터가 가리키는 대상까지 const로 선언하는 것이 보통이다.


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

: 어떤 상수의 유효범위를 클래스로 한정하고자 할 때는 그 상수를 멤버로 만들어야 한다. 그 상수의 사본 개수가 한 개를 넘지 못하게 하고 싶다면 static멤버로 만들어야 한다.


클래스의 상수의 정의는 구현파일에 둔다. 정의에는 상수의 초기값이 있으면 안되는데, 왜냐하면 클래스 상수의 초기값은 해당 상수가 선언된 시점에서 바로 주어지기 때문이다.

#define은 클래스 상수를 정의하는 데 쓸 수없다.(유효 범위를 모른다.), 어떤 형태의 캡슐화 혜택도 받을 수 없다.

* 정적 클래스의 상수의 선언은 헤더 파일에 두고, 정적 클래스 상수의 정의는 구현파일에 두도록 한다.


나열자 둔갑술(enum hack)

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

- const의 주소를 잡아내는 것은 합당, enum, #define의 주소를 얻는 것은 맞지 않다.

- enum은 #define처럼 어떤 형태의 쓸데없는 메모리 할당도 절재 하지 않는다.


인라인 함수, 템플릿

- 매크로의 효율을 그대로 유지함은 물론 정규 함수의 모든 동작방식 및 타입 안전성까지 완벽히 취할수 있는 방법

- 함수 본문에 괄호로 분칠을 할 필요가 없고, 인자를 여러 번 평가할지도 모른다는 걱정이 없다.

- 진짜 함수로 하기 때문에 유효범위 및 접근 규칙을 그대로 따라간다.


const, enum. inline을 통해 #define을 꼭 써야 하는 경우를 많이 줄일 수 있게 된다.


* 단순한 상수를 쓸 때는, #define보다 const 객체 혹은 enum을 우선시 생각한다.

* 함수처럼 쓰이는 매크로를 만들려면, #define보다 인라인 ㅎ마수를 우선시 생각한다.


'Programming > Effective C++' 카테고리의 다른 글

const를 적극 활용하기  (0) 2013.12.28