#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
반응형