아래와 같은 코드를 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
#define SQUARE(x) ((x) * (x))
using namespace std;
int main(void){
int result;
int a = 2;
result = SQUARE(a);
cout << result << endl; // 4
result = SQUARE(++a);
cout << result << endl; // 16
return 0;
}
| cs |
SQUARE(++a); 부분에서 우리는 a가 1이 증가되고 제곱되니 쉽게 9라는 값이 나오기를 예상할 것이다. 하지만 실제 동작은 ((++a) * (++a)) 형태로 동작하게 되어 ++연산이 두번 진행되게 된다.
이러한 코드상의 결함 뿐만 아니라 매크로 함수는 직관적이지 못하고 전처리기에서 진행되는 부분이기 때문에 컴파일시 에러가 발생하지 않을 뿐더러 더버깅이 불가능해 문제가 발생하면 찾기 상당히 어렵다.
아래는 인라인 함수를 통해 새로 구현한 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
using namespace std;
inline int SQUARE(int x){
return x*x;
}
int main(void){
int result;
int a = 2;
result = SQUARE(a);
cout << result << endl; // 4
result = SQUARE(++a);
cout << result << endl; // 9
return 0;
}
| cs |
단순히 SQUARE를 함수로 구현하고 앞에 명시적으로 inline 이라는 키워드를 추가했다.
상당히 쉽지않은가? 그냥 단순히 매크로로 구현할 함수를 일반 함수로 구현하고 앞에 inline만 추가해 주면된다. 위와 같이 코드를 짜면 매크로 함수와 같은 형태로 동작을 하지만 C언어 문법을 사용하기 때문에 디버깅이 수월하며 쉽게 에러를 찾을 수 있다. 위에서 발생하던 문제도 해결되어 9라는 값이 잘 출력된다.
댓글 없음:
댓글 쓰기