在編寫控制台程序的時候我們經常會使用printf輸出調試信息,使我們了解程序的狀態,方便調試,但是當編寫非控制台程序的時候這種方法就行不通了,那我們應該怎么辦?上網查了一些方法,大致就如下幾種
-
使用Log機制
-
用TRACE宏
-
其他
首先,使用Log機制的話要先寫一個Log系統,麻煩。而關於TRACE宏,查了資料后才發現原來是MFC里的東西,那對於非MFC程序,就用不了了。 后來發現了OutputDebugString這玩意兒,發現不錯。他是屬於windows API的,所以只要是包含了window.h這個頭文件后就可以使用了,很方便。他可以把調試信息輸出到編譯器的輸出窗口,如下:還可以用DbgView這樣的工具查看,這樣就可以脫離編譯器了。 下面說說如何使用OutputDebugString,他的函數原型是:
1
|
void
WINAPI OutputDebugString( __in_opt
LPCTSTR
lpOutputString);
|
就一個參數,是LPCTSTR 類型的。
這里我對這個API做了一些包裝,當然,參考了一些文章:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
//木杉的博客 http://www.cnblogs.com/mushan
//2012年6月10日
#ifndef _DEBUGPRINTF_H_
#define _DEBUGPRINTF_H_
#include<Windows.h>
#include <tchar.h>
//用於輸出信息到編譯器輸出窗口的宏定義
//使用win API,DEBUG版本會執行,RELEASE版本則不會
//還可以使用DebugView,WinDbg等工具查看輸出
#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版本中就不會有效。
這樣使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//木杉的博客 http://www.cnblogs.com/mushan
//2012年6月10日
#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);
}
|
不過,輸出這些信息對程序還是有拖慢作用的,像我在寫游戲是使用了這個輸出調試信息就使幀率下降了不少,不過對於非游戲程序應該還是沒有什么影響的