2. #define을 쓰려거는 const,enum,inline을 떠올리자
Posted 2012. 10. 17. 18:22가급적 선행처리가 보다 컴파일러를 더 가까이 하자..
#define ABC 100
전처리기에 의해 ABC는 100으로 치환 된다.
에러발생시 100만 남게되고 이 파일이 자신이 작성한것이 아니라면 어디서 나온 값인지 알아보기 힘
들게 된다. 전처리기에 의해 정의되므로 컴파일러의 기호 테이블에 들어가지 않기 때문이다.
그리고 어떤 형태에서도 캡슐화 혜택을 받을수 없다.
그래서 #define 대신 const를 사용한다.
const int abc = 100;
포인터의 경우 포인터가 가르키는 값까지 상수로 선언해 준다
const char* const name = "hi";
const가 두번 들어간다.
글래스 상수를 정의하는 경우, 어떤 상수의 유효범위를 클래스로 한정하고자 할때 그 상수를 멤버로 만
들어야 하는데. 그 상수의 사본 개수가 한개를 넘지 못하게 하고 싶다면 정적(static)멤버로 만들어야 한다.
class ABC
{
private:
static const int num = 2; // 상수 선언
int ret[num]; // 상수를 사용 하는 부분
};
만약 #define매크로 함수를 사용하게 되면 유효 범위도 없고 컴파일이 끝날때까지 유지된다는 문제가 있다. 하지만 위와같이 클래스 내부에서 정적 클래스 상수로 선언하게 되면 클래스의 캡슐화에도 용이하다. static 멤버는 초기화를 시켜줘야 한다
const int ABC::num = 2;
하지만 이 경우엔 컴파일 과정중 정적클래스 상수의 값이 필요할때 문제가 발생한다. 정적 클래스 상수에 대한 값이 초기화 되지 않았기 때문이다. 이를 해결하기 위한 방법으로 enum을 사용 한다.
class ABC
{
private:
enum{ num = 2 }; // enum을 사용하여 num을 2에 대한 기호식으로 만듬
};
enum은 const보다 define에 가깝다. const의 주소를 알아내는것은 가능하지만 enum의 주소를 알아내는것은 불법이며 define의 주소를 얻어 내는것 또한 그러하다. 본인이 선언한 정수형 상수를 다른 사람이 접근하는 것을 막으려 한다면 enum을 사용 하는 것이 좋다. 그리고 enum은 define과 마찬가지고 어떤 형태의 쓸데없는 메모리 할당도 저지르지 않는다.
그리고 #define의 가장 큰 오류는 매크로 함수이다
#define CALL_WITH_MAX(a, b) f( (a)>(b) ? (a):(b) )
이런식의 매크로는
#define CALL_WITH_MAX(a, b) ((a)>(b)?(a):(b))
int main()
{
int a = 5, b = 0;
int result = 0;
result = CALL_WITH_MAX(++a,b);
printf("%d", a); // a가 2번증가한다
printf("%d", b);
printf("%d", result);
a = 5, b = 0;
result = CALL_WITH_MAX(++a,b+10);
printf("%d", a); // a가 1번 증가한다
printF("%d", b);
printF("%d", result);
}
이것처럼 비교를 통해 처리한 결과가 어떤것이냐에 따라 달라진다.
이를 대체하기 위해 인라인 함수에 대한 템플릿을 사용한다. 이 함수는 기본의 매크로 함수의 효유을
그대로 유지함은 물론 정규 함수의 모든 동작 방식 및 타입의 안정성까지 취할 수 있다.
template<typename T>
inline int MAX( const T&, const T& b ) // T의 정확한 자료형을 모르기때문에 매개변수로 상수객체
{ 에 대한 참조자를 쓴다
return a > b ? a : b;
}
이 함수는 템플릿 이기 때문에 동일 계열 함수군을 만들어 낸다. 동일한 타입의 두 객체 두개를 인자로
받고 둘 중 큰 값을 리턴하는 구조다. 그리고 MAX는 함수기 때문에 유효 범위와 접근 규칙을 그대로따른다. 이것은 클래스 내부의 함수, 클래스 매서드로 만들어도 전혀 이상하지 않다.
#define 을 대신하여 더욱 활용가치가 높은 const, enum. inline 키워드를 사용하여 전처리기 활용을
많이 줄일 수 있다.
< 단순한 상수를 쓸때는 #define 보단 const 또는 enum을 우선으로 생각하자 >
< 함수처럼 쓰이는 매크로를 만드려면 #define 매크로 보다 inline함수를 우선 생각 하자 >
'BOOK > Effective C++ 3판' 카테고리의 다른 글
7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 virtual로 (0) | 2012.10.18 |
---|---|
5. C++이 은근슬쩍 만들어 호출해버리는 함수들에 촉각을 세우자 (0) | 2012.10.17 |
4. 객체를 사용하기 전에 반드시 그 객체를 초기화 하자 (0) | 2012.10.17 |
3. 낌새만 보이면 const를 들이대 보자 (0) | 2012.10.17 |
1. C++ 언어들의 연합체로 바라보는 안목은 필수 (0) | 2012.10.17 |
- Filed under : BOOK/Effective C++ 3판