반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Python
- 리트코드
- baekjoon
- LeetCode
- 알고리즘
- 백트래킹
- 취준
- DP
- C++
- Github
- 코딩테스트
- 프로그래머스
- git
- ASF-110
- GitHub Desktop
- programmers
- 격리수준
- 자소서
- Algorithmus
- python3
- algorithm
- 백준
- 프로콘
- 프로콘 갈림현상
- SRE
- Pro-Con
- 제노블레이드 2
- Ultimate Search
- 알고리즘 종류 정리
- 네이버 검색 시스템
Archives
- Today
- Total
산타는 없다
매크로 함수를 지양해야 하는 이유 본문
반응형
#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);
}
반응형