이걸 사용하는 대부분는 디버그 모드에서는 해당 메크로를 사용하고 릴리즈 모드에서는 사용하지 않을려고 하려는 경우이다. 이는 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.
'3.구현 > VC++' 카테고리의 다른 글
DOS창에서 일부 출력 문자열 색상 변경하기 (0) | 2009.09.21 |
---|---|
VC에서 윈도우 에러메시지 (0) | 2009.09.01 |
리다이렉션이용한 디버깅 메시지 출력 (0) | 2009.08.14 |
Vista 호환 프로그램 데이터 저장위치 다루기 (0) | 2009.07.31 |
[컨트롤이야기] 리치에디트(RichEdit) 컨트롤 사용하기 (4) | 2009.06.18 |