본문 바로가기
C++

Effective C++ 항목 2 : #define을 쓰려거든 const, enum, inline을 떠올리자

by imagineer_jinny 2023. 12. 12.

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

#define 은 선행처리 해버리기 때문에 컴파일러가 알 수 없다.

#define Angle 1.653

 

이러면 에러 메세지에 Angle 대신 1.653만 나옴 (찾기 어려움)
대신 const를 사용한다.

const double angle = 1.653;

 

 

나열자 둔갑술 (enum hack)


메모리 할당이 싫고, 해당 객체에서만 사용하게 하고 싶다.

class GamePlayer
{
    private:
    enum { NumTurns = 5 };

    int scores[NumTurns];
    ...

}


표준에 어긋난 구식 방법이지만 유용함


매크로의 단점
선행 처리 하기 때문에 오용될 수 있음

#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 함수에 대한 템플릿)

template
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}

 

 

이것만은 잊지 말자!

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

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

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

Effective C++ 항목 1 : C++를 언어들의 연합체로 바라보는 안목은 필수  (0) 2023.12.10
스마트 포인터  (0) 2022.11.12
#10. 네트워크  (0) 2022.05.16
#7. STL , - Vector  (0) 2022.04.28
#5. 자료구조  (0) 2022.04.04

댓글