본문 바로가기
Programming/C / C++

ASSERT, VERIFY, TRACE

by deviAk 2007. 1. 31.
반응형

출처 : www.sprite3d.net


MFC가 아닌 응용프로그램에서 ASSERT(), VERIFY(), TRACE() 사용하기
by Gabriel Fleseriu

원문 : http://www.gamedev.net/reference/articles/article1846.asp
번역 : conaman(conaman@spirit3d.net)


C++ 로 게임 개발을 해 올 때 몇몇 사람들이 MFC를 사용하기로 결정을 했습니다 늘 저는 ASSERT(), VERIFY(), TRACE() 매크로들의 유익함을 발견합니다 그래서 저는 윈도우 플랫폼을 위한 어떤 프로젝트에서든지 작업할 수 있도록 제 자신의 버전을 만들기로 했습니다.

약간 생각하게 하는 것들:

  • ASSERT()는 값이 0이면 실행을 멈추도록 하기 위해 매개변수을 평가하기로 되어있습니다 릴리즈 모드에서는 assert가 아무것도 전개되지 않도록 해야만 합니다.
  • VERIFY()는 릴리즈 모드에서 매개변수를 전개하도록 되어 있는 것을 제외하고는 ASSERT() 와 아주 유사합니다.
  • ASSERT() 는 어떠한 함수호출도 포함되어 있지 않는 표현으로 사용되어야만 합니다. 함수호출을 포함하는 표현을 위해 VERIFY() 를 사용해야만 하고, 그렇게 해서 함수호출은 릴리즈 모드에서도 보전됩니다.
  • TRACE() 는 디버그 윈도우에 출력되는 것을 제외하고는 printf() 의 대응물입니다. 릴리즈 모드에서는 TRACE() 또한 아무것도 전개하면 안 됩니다.
  • 세개의 매크로들 중 어떤것도 릴리즈 모드에서 어떤 런타임 벌점을 의미하지 않습니다. 그 매크로들은 미리 정의된 _DEBUG 매크로를 사용해서 디버그 모드와 릴리즈 모드 사이를 구별합니다. 이것은 Microsoft Visual C++에 특정적입니다. 만약 다른 몇몇 다른 컴파일러를 사용하고 있다면 적절한 매크로를 사용해야만 할 것입니다.
  • 바퀴를 재발명하기 위해 어떤 이해도 없기 때문에 저는 MFC 코드로 슬쩍 엿봤고 유사하게 저의 매크로들을 만들었습니다. ASSERT() 와 VERIFY() 를 위해서 저는 멋진 "Debug assertion failed..." 대화상자들은 곁에 남겨두고 간단하게 아주 평범한 breakpoint 를 구현 했습니다.


    ASSERT(), VERIFY(), TRACE() 를 지원하는데 필요한 두 파일들이 있습니다. 그것은 debug.h 와 debug.cpp 입니다. 프로젝트의 몇몇 메인 헤더에 debug.h 를 추가해야만 합니다. 그것은 자신 안에 어떤 파일도 포함하지 않기 때문에 순환 포함(recurrent inclusion) 들에 더럽혀지지 않습니다. 또한 프로젝트의 소스파일들에 debug.cpp 를 더해야만 합니다.


    여기에, 그것들이 있습니다.

    // file debug.h
    #ifndef __DEBUG_H__
    #define __DEBUG_H__
    #ifdef _DEBUG
    void _trace(char *fmt, ...);
    #define ASSERT(x) {if(!(x)) _asm{int 0x03}}
    #define VERIFY(x) {if(!(x)) _asm{int 0x03}}
    #else
    #define ASSERT(x)
    #define VERIFY(x) x
    #endif
    #ifdef _DEBUG
    #define TRACE _trace
    #else
    inline void _trace(LPCTSTR fmt, ...) { }
    #define TRACE  1 ? (void)0 : _trace
    #endif
    #endif // __DEBUG_H__


    //file debug.cpp
    #ifdef _DEBUG
    #include <stdio.h>
    #include <stdarg.h>
    #include <windows.h>
    void _trace(char *fmt, ...)
    {
        char out[1024];
        va_list body;
        va_start(body, fmt);
        vsprintf(out, fmt, body);
        va_end(body);
        OutputDebugString(out);
    }
    #endif
    반응형