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


by Gabriel Fleseriu

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

출처: http://www.spirit3d.net/MainFrameSet.htm

 

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 를 더해야만 합니다.

     

    Here they are:

    /*
     *  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__

     

    /*
     *  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

    Discuss this article in the forums


    안정적인 DNS서비스 DNSEver DNS server, DNS service
    Posted by 키르히아이스
    ,