#define 안녕(effective c++ 02)
2015. 7. 27. 03:21ㆍ프로그래밍/Effective C++
728x90
728x90
#define 문제점
#define은 C++언어 자체의 일부가 아닌 것으로 취급될 수 있다.
사람들에겐 기호식 이름(Symbolic name)으로 보이지만 컴파일러에겐 보이지 않기 때문에 숫자 상수로 대체된 코드에서 컴파일 에러가 발생 시 혹은 디버깅 시에 문제가 생길 수 있다.
매크로 대신 상수를 사용한다!
언어 차원에서 지원하는 타입이기 때문에 컴파일러 눈에도 보이며 기호 테이블에도 들어간다.
최종 코드의 크기가 #define을 썼을 때보다 작게 나올 수 있다. ( 매크로는 목적 코드 안에 사본이 등장 횟수만큼 들어가지만, 상수는 사본이 한 개만 생긴다. )
주의사항
상수 포인터( constant pointer )를 정의 하는 경우
상수 정의 는 대개 헤더 파일에 넣는 것이 상례이므로 포인터는 꼭 const로 선언하고 대상까지 const로 선언하는 것이 보통
문자열 상수를 쓸 때 char * 보다는 string 객체가 사용하기 더 좋다.
클래스 멤버로 상수를 정의하는 경우
상수의 유효범위를 클래스로 한정하고자 할 때는 그 상수를 멤버로 만들어야 하는데 사본 개수가 한 개를 넘지 못하게 하고 싶다면 static 멤버로 만들어야 한다.
클래스 상수의 정의는 구현파일에 두고 헤더 파일에 두지 않는다.
정의에는 상수의 초기값이 있으면 안 되는데, 클래스 상수의 초기값은 해당 상수가 선언 된 시점에서 바로 주어지기 때문이다.
Enum hack
해당 클래스를 컴파일 하는 도중에 클래스 상수의 값이 필요한 경우
정수 타입의 정적 클래스 상수에 대한 클래스 내 초기화를 금지 하는 구식 컴파일러에 대한 경우
동작 방식이 const 보다는 define에 가깝다.
enum은 define처럼 어떤 형태의 쓸데없는 메모리 할당을 하지 않는다.
상당히 많은 코드에서 이 기법을 쓰고 있다.
템플릿 메타프로그래밍의 핵심 기법
1 2 3 4 5 6 7 8 9 10 | class MyClass { public: MyClass() { } ~MyClass() { } private: enum { MAX = 5 }; int num[MAX]; }; | cs |
매크로 함수
문제점
괄호로 인한 예상할 수 없는 결과 도출, 디버깅이 어렵다.
매크로보단 inline을 써보자!
기존 매크로의 효율을 그대로 유지한다.
정규 함수의 모든 동작방식 및 타입 안전성까지 완벽히 취할 수 있다.
결론
단순한 상수를 쓸 때는, #define 보다 const 객체 혹은 enum을 우선 생각하자.
함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수를 우선 생각하자.
728x90
반응형
'프로그래밍 > Effective C++' 카테고리의 다른 글
디폴트들 사용금지령(effective c++ 06) (0) | 2015.07.27 |
---|---|
컴파일러의 디폴트 제공 함수들(effective c++ 05) (0) | 2015.07.27 |
const 들이대기(effective c++ 03) (0) | 2015.07.27 |
C++은 연합체로 바라보자(effective c++ 01) (0) | 2015.07.27 |
객체 복사(effective c++ 12) (0) | 2015.07.26 |
(작성중)배열 vs 다형성(more effective c++ 03) (0) | 2015.07.25 |
C++ 캐스팅(more effective c++ 02) (0) | 2015.07.25 |