문제를 해결할 때, VS의 디버깅 툴이나 gdb를 사용하지 않고 빠르게 오류를 잡아낼 수 있는 능력이 중요하다. 그 방법 중 가장 기본적인 것으로는 오류가 있다고 의심되는 변수의 값을 찍어보는 방법이 있는데, 아래는 print debugging을 편리하게 해줄 코드 snippet 이다.
string to_string(string s) {
return '"' + s + '"';
}
string to_string(const char* s) {
return to_string((string) s);
}
string to_string(bool b) {
return (b ? "true" : "false");
}
template <typename A, typename B>
string to_string(pair<A, B> p) {
return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
string to_string(A v) {
bool first = true;
string res = "{";
for (const auto &x : v) {
if (!first) {
res += ", ";
}
first = false;
res += to_string(x);
}
res += "}";
return res;
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
cerr << " " << to_string(H);
debug_out(T...);
}
#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
작성된 코드의 여러 부분에서 debug() 함수를 호출하여 변수 값들을 출력하고 오류를 잡아냈다면 코드를 최종 제출하기 위해서는 여러 군데 위치해 있는 debug() 함수들을 다시 지워야 한다. 이는 굉장히 번거롭기 때문에 이 과정을 거치지 않고도 바로 제출하기를 원할 것이다. 이를 위해서 "LOCAL" 매크로가 존재하는 경우에만 debug() 함수의 동작을 정의한다. 코드를 제출할 환경이 컴파일 시에 "LOCAL" 매크로를 포함하지 않는다면, debug() 함수를 호출한 흔적을 없애지 않고 그대로 제출해도 문제가 없을 것이다. 컴파일러마다 다르겠지만 예를 들어 g++을 이용한다면, 컴파일 할때 -D 옵션을 사용하여 "LOCAL" 매크로를 선언해주어야 한다. (그게 아니라면 코드 내에 "LOCAL" 매크로를 선언해야 함) 이 코드 snippet은 tourist가 작성한 소스 코드로부터 가져왔다.
No comments:
Post a Comment