본문 바로가기

3.구현/VC++

매크로를 조건에 따라 실행하기

이걸 사용하는 대부분는 디버그 모드에서는 해당 메크로를 사용하고 릴리즈 모드에서는 사용하지 않을려고 하려는 경우이다. 이는 MFC의 TRACE 매크로를 참고하였다.
생각보다는 단순하다. 그러나 알기 전까지는 생각해내기가 쉽지않다.

작성일: 2009.08.14 (http://ospace.tistory.com/), ospace114@empal.com

코드

실제 코드를 보자. ASSERT 매크로를 사용한다고 가정하자. 그래서 디버그 모드일 경우에만 ASSERT 기능을 수행하고, 그렇지 않으면 ASSERT 매크로가 작동하지 않도록 한다.

#ifdef _DEBUG
#define ASSERT(s) assert(s)
#else
#define ASSERT(s) ((void)0)
#endif

위 코드에서 ((void)0)이 핵심이다. 만약 다음처럼 한다면 오류가 발생한다.

#define ASSERT(s)

실제 사용을 보면,

ASSERT( val != NULL );

디버깅 모드가 아니라면 다음과 같은 코드가 된다.

; // 달랑 이거뿐

당연히 컴파일 에러가 발생한다.

위를 응용하면 단순히 디버그 모드가 아니라 전처리기에 의해서 선택적으로 매크로를 실행할 수 있게된다.

결론

사실 알고 보면 별거 아닌데, 쉽게 찾기 힘들다. 물론 뛰어난 프로그래머라면 바로 알 수 있겠지만, 본인은 혼자 생각하다가 포기하고 다른 코드를 참고했다. ㅡ.ㅡ;

사실 디버깅과 릴리즈 모드를 따로 작동하는 코드를 만드는 것은 좀 위험할 수 있다. 그런 이유는 서로 다른 코드가 있다는 것은 각각의 실행환경과 코드 자체가 달라진다는 의미이다. 즉 디버기 모드에서는 잘됬는데 릴리즈에서는 안되던가, 반대로 릴리즈 모드에는 실행되는데 디버그 모드로만 가면 죽어버리는 경우가 발생한다.

주의해서 코딩하지 않으면 치명적인 독이 될 수도 있다.
모두 즐프~~ ospace.

반응형