책: Effective C++
주제: C에서 C++로의 전환
항목: #define보다는 const와 inline을 사용한다.


inline 함수에 대해서..

#define을 이용하는 또 다른 하나의 예는 다음과 같이 함수 매크로를 구현하는 경우이다.

#define max(a,b) ((a) > (b) ? (a) : (b))


이와 같이 매크로를 작성할 때는 언제나 매크로 몸체의 모든 인자를 괄호로 묶어야 한다. 그러나 이를 올바르게 적용하더라도 발생할 수 있는 신기한 상황이 존재한다.

int a = 5, b = 0;
max(++a, b); // a가 두 번 증가한다.
max(++a, b+10); // a가 한 번 증가한다.


위와 같은 상황은 inline 함수를 사용함으로써 매크로의 모든 효율성, 모든 예측 동작 및 정규 함수의 타입 안정성을 취할 수 있다.

inline int max(int a, int b) { return a > b ? a : b; };


위의 매크로는 int 타입에 대해서만 적용할 수 있기에, #define을 이용한 경우와 다소 차이가 있다. 그러나 템플릿을 이용하면 문제를 해결할 수 있다.

template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

Posted by 하솔

2005/07/18 15:21 2005/07/18 15:21
Response
No Trackback , No Comment
RSS :
http://blog.hasol.net/rss/response/305

책: Effective C++
주제: C에서 C++로의 전환
항목: #define보다는 const와 inline을 사용한다.


전처리기(preprocessor)보다는 컴파일러를 선호하는 경향을 가져야 한다.

#define ASPECT_RATIO 1.653

위의 코드는 전처리기에서 처리하기 때문에 실제 컴파일러는 ASPECT_RATIO를 전혀 알 수 없다. 따라서, 컴파일 시 에러가 발생했을 경우 에러 메세지에 ASPECT_RATIO나 1.653에 대한 언급이 전혀 없기 때문에 혼란을 야기할 수 있다.

따라서, 다음과 같이 상수로 정의하는 것이 좋다.

const double ASPECT_RATIO = 1.653;


상수(const variable)로 정의함으로써 얻어지는 이점은 다음과 같다.

1. 상수 포인터를 정의하기가 까다롭다.
예) const char * 기반의 스트링 정의 시 const를 두 번 사용해야 한다.
cost char * const authorName = "Scott Meyers";


2. 클래스 범위에서의 상수 정의
상수의 영역을 클래스로 제한하기 위해서는 단 한 개의 복사본이 있따는 것을 확신하기 위해 정적(static) 멤버로 만들어야 한다.
class GamePlayer {
private:
static const int NUM_TURNS = 5; // 상수 선언
int scores[NUM_TURNS]; // 상수의 사용
...
};

단, 위에서 보는 코드는 선언(declaration)이지 정의(definition)가 아니다. 즉, 구현 파일에 정적 클래스 멤버를 정의해야 한다.
const int GamePlayer::NUM_TURNS; // 필수적인 정의


만약 위와 같이 안 된다면, 다음과 같이 작성한다.

// in header file;
class EngineeringConstants {
private:
static const double FUDGE_FACTOR;
...
};

// in class implementation file;
const double EngineeringConstants::FUDGE_FACTOR = 1.35;


클래스 내 정수형 클래스 상수에 대해 초기값 지정을 금지하는 컴파일러를 보완하기 위한 일반적인 방법은 enum을 이용하는 것이다.

class GamePlayer {
private:
enum { NUM_TURNS = 5 }; // "the enum hack" - makes
int scores[NUM_TURNS]; // this is fine
};

Posted by 하솔

2005/07/11 15:04 2005/07/11 15:04
Response
3 Trackbacks , 2 Comments
RSS :
http://blog.hasol.net/rss/response/304


블로그 이미지

스스로의 경제학..

- 하솔

Notices

Archives

Authors

  1. 하솔

Calendar

«   2013/06   »
            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            

Site Stats

Total hits:
219037
Today:
56
Yesterday:
208