일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 오블완
- reference
- operator new
- 영화 리뷰
- 메타테이블
- UE4
- lua
- Effective c++
- Smart Pointer
- 상속
- resource management class
- 암시적 변환
- Vector
- virtual function
- 루아
- 스마트 포인터
- 언리얼
- exception
- 게임
- 예외
- more effective c++
- 영화
- 티스토리챌린지
- c++
- implicit conversion
- effective stl
- 참조자
- 반복자
- 비교 함수 객체
- 다형성
Archives
- Today
- Total
스토리텔링 개발자
[Effective C++] 2. #define 없애기 본문
728x90
항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자
선행 처리자(define)의 문제
- 선행처리자는 컴파일러로 넘어가기 전에 숫자 상수로 대체된다.
- 컴파일러 기호 테이블에 선행처리자 상수 이름은 들어가지 않는다.
- 선행처리자의 이름으로 디버깅할 수 없다.
- 선행처리자는 대부분 const로 대체 가능하므로 const로 대체하도록 하자.
const 정의 시 주의할 점
- 상수 포인터를 정의하는 경우, const를 붙여주는 위치를 주의해야 한다.
- 포인터를 const로 할 것인가, 가리키는 대상을 const로 할 것인가에 따라 const 위치가 달라진다.
- 차라리 둘 다 const를 붙여서 모호성을 제거해주는 게 나을 것이다.
- 클래스 멤버로 상수를 정의하는 경우
- static 멤버로 해주는 편이 좋다. 그렇지 않으면 상수의 사본 갯수가 인스턴스 갯수에 따라 계속해서 늘어난다.
- 클래스 상수로 활용할 수 있다.
- 선행처리자는 유효 범위가 없어서 클래스 상수로 활용할 수 없다.
클래스 멤버로 상수 정의
- 정적 멤버로 만들어지는 정수류 타입 클래스 내부 상수는 정의 없이 선언만으로 사용 가능하다.
class Test { private: static const int numTurns = 5; int InTest[numTurns]; }
- 하지만 컴파일러 특성에 따라 불가능할 수도 있다. 그럴 경우 cpp 파일에 다음처럼 정의을 삽입해야 한다.
const int Test::NumTurns;
- 상수 초기값을 넣지 못하는 구식 컴파일러를 사용하고 있다면
- 나열자 둔갑술을 사용하여 우회하도록 하자.
- 나열자 둔갑술(enum hack) : 나열자는 int 위치에서 쓰일 수 있음을 활용한다.
-
class Test { private: enum { numTurns = 5 } int InTest[numTurns]; }
- 이는 const보다 #define에 가깝다. const 주소를 취하는건 합당하지만 enum, #define의 주소를 취하는 것은 불법이기 때문이다.
- 좋지 않은 컴파일러는 const 객체의 저장공간을 준비할지도 모른다. 고로, 메모리를 확실히 아끼고 싶을 때 사용한다.
- 나열자 둔갑술은 템플릿 메타 프로그래밍의 핵심 기술이다.
선행처리자 오용 시 문제점
- 매크로는 함수 호출을 없애주지만 범위 관련해서 직관적이지 않아 오류 및 가독성의 문제가 있다.
- 선행처리자 대신 인라인 함수에 대한 템플릿을 사용하면 매크로 효율을 유지하면서 타입안정성도 챙길 수 있다.
인라인 함수에 대한 템플릿(inline)
- 매크로의 단점인 괄호 남발, 인자 여러번 평가가 없다.
- 진짜 함수라서 유효 범위 및 접근 규칙을 그대로 따른다.
728x90
'개발 > Effective C++' 카테고리의 다른 글
[Effective C++] 6. 암시적으로 생성되는 함수 금지하기 (0) | 2024.05.20 |
---|---|
[Effective C++] 5. 암시적으로 생성되는 함수 (0) | 2024.05.17 |
[Effective C++] 4. 객체 초기화 문제 (0) | 2024.05.16 |
[Effective C++] 3. const 선호하기 (0) | 2024.05.14 |
[Effective C++] 1. C++을 포괄하는 개념 (0) | 2024.05.13 |
Comments