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

#define으로 상수를 썼을 경우 파일 에러라도 발생하게 되면 에러 메시지엔 설정한 숫자가 나올 수 있다.

이 문제의 해결법은 매크로 대신 상수를 쓰는 것

상수 타입은 아무리 여러 번 쓰이더라도 사본은 딱 한 개만 생기기 때문

#define을 상수로 교체할 때

1. 상수 포인터를 정의하는 경우 - 포인터는 꼭 const로 선언해 주어야 하고, 포인터가 가리키는 대상까지 const로 선언하는 것

2. 클래스 멤버로 상수를 정의하는 경우 - 그 상수의 사본 개수가 한 개를 넘지 못하게 하고 싶다면 정적(static) 멤버로 만들어야 한다. 클래스 상수의 정의는 구현 파일에 둔다. 정의에는 상수의 초기값이 있으면 안되는데, 클래스 상수의 초기값은 해당 상수가 선언된 점에는 바로 주어지기 때문.

예외로 해당 클래스를 컴파일 하는 도중에 클래스 상수의 값이 필요할 때, 이를테면 배열 멤버를 선언할 때가 대표적인 예, 정수 타입의 정적 클래스 상수에 대한 클래스 내 초기화를 금지하는 나열자 둔갑술(enum hack)으로 사용

 

나열자 둔갑술의 동작 방식은 const보다는 #define에 가깝다. 

상당히 많은 코드에서 이 기법이 쓰이고 있다. (템플릿 메타프로그래밍의 핵심 기법)

 

#define 지시자의 또 다른 오용 사례 - 매크로 함수

단점 : 호출하기 전에 ++을 슨다면 증가하는 횟수가 달라진다.

 

대신 인라인 함수에 대한 템플릿을 사용

템플릿이기 때문에 동일 계열 함수군(family of functions)을 만들어냄

 

#define 대신에 const, enum, inline을 사용하는 것이 좋다.

 

 

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

생성자, 소멸자, 대입 연산자(1)  (0) 2022.02.04
객체 초기화  (0) 2022.01.31
const  (0) 2022.01.25
C++  (0) 2022.01.16
explicit  (0) 2022.01.13

+ Recent posts