<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    在非MFC程序中使用調試宏 ASSERT(),VERIFY()和 TRACE()

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    游戲制作已經開始采用C++了,卻鮮有人選擇使用MFC。但筆者覺得的 ASSERT(),VERIFY()和 TRACE()這幾個宏很好用。所以就想自己寫一個版本來適應Windows平臺下不同的工程類型。

    提醒:

  • ASSERT()被測試它的參數,若參數為0,則中斷執行并打印一段說明消息。在 Release 版本的程序中它不起任何作用。
  • VERIFY()和 ASSERT()很相似,區別在于在 Release 版本中它仍然有效(譯者注:原作者在這里沒有講清楚,VERIFY()不會打印說明,只是會對參數表達式求值)。
  • ASSERT()使用的時候必須保證參數表達式中不能有函數調用(譯者注:ASSERT()宏在 Release 版本中不對表達式求值),因此對于任何有函數調用的參數表達式,應該使用宏 VERIFY(),以保證表達式中的函數調用在 Release 版本中會被正確求值。
  • TRACE()基本上就是函數 printf()的一個復制品,唯一的區別是它把結果輸出到調試窗口。在 Release 版本中,它也是無效的。
  • 這三個宏在 Release 版本中都不會產生任何實質性的影響,它們是否起作用取決于是否定義了預定義了宏 _DEBUG。這是對 Microsoft Visual C++ 而言,在其它的編譯器中可能其它不同的宏。
  • 這里是代碼:

     

    [cpp] view plaincopy
    1. #include "stdafx.h"  
    2. #include <stdio.h>  
    3. #include <stdarg.h>  
    4. #include <windows.h>  
    5.   
    6. void _trace(char *fmt, ...);  
    7.   
    8. #ifdef _DEBUG  
    9. #define ASSERT(x) {if(!(x)) _asm{int 0x03}}  
    10. #define VERIFY(x) {if(!(x)) _asm{int 0x03}}     // 譯注:為調試版本時產生中斷有效  
    11. #else  
    12. #define ASSERT(x)  
    13. #define VERIFY(x) x                             // 譯注:為發行版本時不產生中斷  
    14. #endif  
    15.   
    16. #ifdef _DEBUG  
    17. #define TRACE _trace      
    18. #else  
    19. inline void _trace(LPCTSTR fmt, ...) { }  
    20. #define TRACE    
    21. #endif  
    22.   
    23.   
    24. void _trace(char *fmt, ...)  
    25. {  
    26.     char out[1024];  
    27.     va_list body;  
    28.     va_start(body, fmt);  
    29.     vsprintf(out, fmt, body);     // 譯注:格式化輸入的字符串 fmtt  
    30.     va_end(body);                 //       到輸出字符串 ou  
    31.     OutputDebugStringA(out);       // 譯注:輸出格式化后的字符串到調試器  
    32. }  

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全