Note
C++에는 미리 정의된 동적 매크로가 있다.
__FILE__
- 해당 위치의 소스파일 경로를 문자열로 가져온다.
__LINE__
- 해당 위치의 줄 번호를 정수로 가져온다.
그리고 매크로의 매개변수를 무조건 스트링으로 변환하여 가져올 수 있는 방법이 존재한다.
#define MACRO(x) #x
- x에 위치한 코드를 문자열로 변환하여 가져온다.
이를 이용하면 해당 소스코드와 실행 위치 정보를 간단히 출력할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
#define ShowCodeInfo(x) cout << "Code : " << #x << endl\
<< "Line : " << __FILE__ << " : " << __LINE__ << endl << endl;
void main()
{
int a;
ShowCodeInfo(cout << test);
}
그리고 이를 디버깅에 활용할 수 있다.
Smart Debugging
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
#define ShowCodeInfo(x) cout << "Code : " << #x << endl\
<< "Line : " << __FILE__ << " : " << __LINE__ << endl << endl;
#define Assert(x, value) x; \
if(x != value) { \
cout << "Assert : [" << #x << "] must be [" << value << "], but [" << x << "]" << endl;\
ShowCodeInfo(x); \
__debugbreak(); \
}
void main()
{
int a = 1;
int b = 2;
Assert(a + b, 3);
Assert(a + b, 4);
}
Assert(code, value);
형태로 사용한다.- 해당 코드의 결괏값이 value와 동일하면 정상적으로 실행된다.
- 해당 코드의 결괏값이 value와 다를 경우, 중단점을 트리거하고 코드의 정보와 현재값, 의도한 값, 소스 코드 정보와 해당 라인까지 모두 출력해준다.