카테고리 없음

Item2 - #define을 쓰려거든 const, enum, inline을 떠올리자

해달 2018. 1. 24. 21:23

Item2 - #define을 쓰려거든 const, enum, inline을 떠올리자

챕터 핵심 내용

  • 단순한 상수를 쓸 대는, #define보다 const 객체 혹은 enum을 우선 고려하자.
  • 함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수를 우선 고려하자.

- 단순한 상수를 쓸 대는, #define보다 const 객체 혹은 enum을 우선 고려하자

  • 전처리기로 기호상수를 정의할 시, 컴파일러의 기호 테이블에 추가되지 않는다.
  • 이는, 작동 방식이 '대체'이기 때문이다.
  • 디버깅을 할 때, 난감할 수 있다.
  • 또한, 코드의 길이가 늘어난다.
  • 클래스 상수를 정의할 땐, enum을 응용할 수 있다.
  1. 동작 방식이 const보다 #define에 가깝다.
  2. 옛날 코드들에게서 발견될 수 있다.

- 함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수를 우선 고려하자

  • #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가 한 번 증가
  • 함수의 장점과 매크로의 장점을 취하고 있는 inline 함수를 사용하자.

후기(postscript)

C++11부터는 변수나 함수를 상수표현식으로 나타낼 수 있는 constexpr 형식 특정자(specifier)가 추가되었다. 이 형식 특정자는 컴파일 시간에 변수나 함수의 값을 평가한다.