在編寫控制檯程序的時候我們經常會使用printf輸出調試信息,使我們瞭解程序的狀態,方便調試,但是當編寫非控制檯程序的時候這種方法就行不通了,那我們應該怎麼辦?上網查了一些方法,大致就如下幾種
首先,使用Log機制的話要先寫一個Log系統,麻煩。而關於TRACE宏,查了資料後才發現原來是MFC裏的東西,那對於非MFC程序,就用不了了。 後來發現了OutputDebugString這玩意兒,發現不錯。他是屬於windows API的,所以只要是包含了window.h這個頭文件後就可以使用了,很方便。他可以把調試信息輸出到編譯器的輸出窗口,如下:還可以用DbgView這樣的工具查看,這樣就可以脫離編譯器了。 下面說說如何使用OutputDebugString,他的函數原型是:
void WINAPI OutputDebugString( __in_opt LPCTSTR lpOutputString);
就一個參數,是LPCTSTR 類型的。
這裏我對這個API做了一些包裝,當然,參考了一些文章:
-
-
-
- #ifndef _DEBUGPRINTF_H_
- #define _DEBUGPRINTF_H_
-
- #include<Windows.h>
- #include <tchar.h>
-
-
-
-
-
- #ifdef _DEBUG
-
- #define DP0(fmt) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt));OutputDebugString(sOut);}
- #define DP1(fmt,var) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var);OutputDebugString(sOut);}
- #define DP2(fmt,var1,var2) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2);OutputDebugString(sOut);}
- #define DP3(fmt,var1,var2,var3) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2,var3);OutputDebugString(sOut);}
-
- #endif
-
- #ifndef _DEBUG
-
- #define DP0(fmt) ;
- #define DP1(fmt, var) ;
- #define DP2(fmt,var1,var2) ;
- #define DP3(fmt,var1,var2,var3) ;
-
- #endif
-
- #endif
其中的DP就是表示BebugPrint。而且這些調試輸出只會在BEBUG版本中有效,在Release版本中就不會有效。
這樣使用:
-
-
-
- #include<stdio.h>
- #include"debugPrint.h"
- void main()
- {
- for(int i=0;i<10;i++)
- {
- printf("hello!\n");
- DP0("這是調試信息!\n");
- DP1("這是調試信息%d\n",i);
- DP2("這是調試信息%d--%d\n",i,i+1);
- DP3("這是調試信息%d--%d--%d\n",i,i+1,i+2);
- }
- getc(stdin);
- }
不過,輸出這些信息對程序還是有拖慢作用的,像我在寫遊戲是使用了這個輸出調試信息就使幀率下降了不少,不過對於非遊戲程序應該還是沒有什麼影響的。