산타는 없다

매크로 함수를 지양해야 하는 이유 본문

프로그래밍 서적/Effective C++

매크로 함수를 지양해야 하는 이유

LEDPEAR 2021. 9. 29. 19:31
반응형
#define CALL_WITH_MAX (a, b) ((a) > (b) ? (a) : (b))

int main()
{
    int x = 5, y = 0;
    CALL_WITH_MAX(++x, y);
    CALL_WITH_MAX(++x, y + 10);
}

 

위와 같은 매크로 함수가 있을 때 

CALL_WITH_MAX(++x, y); 이후의 x의 값은 7이 되고

CALL_WITH_MAX(++x, y + 10); 이후의 x의 값은 8이 된다

그 이유는 일반 함수와 다르게 매크로 함수는 값이 치환되는 개념이기 때문이다

CALL_WITH_MAX(++x, y) -> ((++x) > (y) ? (++x) : (y)) 로 치환되어 비교할 때 한번 그리고 결과를 반환할 때 한번 더 증가되어 총 두 번 증가된다.

CALL_WITH_MAX(++x, y + 10) 는 ((++x) > (y + 10) ? (++x) : (y + 10)) 로 치환하기 때문에 비교할 때 한번 증가하지만 반환될 때는 y + 10을 반환하기 때문에 증가되지 않아서 한 번만 증가된다.


일반 함수의 경우 계산된 결과 값이 매개변수로 전달되지만 매크로함수는 위와 같이 치환이 되기 때문에 프로그래머의 의도와 다르게 동작을 할 가능성이 높아진다. 때문에 지양하는 것이 좋다.

C++에서는 인라인(inline) 함수로 대처할 수 있습니다.

template <typename T>
inline void callWithMax(const T& a, const T& b)
{
	f(a > b ? a : b);
}
반응형
Comments