VC中除錯巨集的應用

2021-04-19 01:47:30 字數 3010 閱讀 5564

一、

trace

巨集

當選擇了

debug

目標,並且

afxtraceenabled

變數被置為

true

時,trace

巨集也就隨之被啟用了。但在程式的

release

版本中,它們是被完全禁止的。下面是乙個典型的

trace

語句: …

int ncount =9;

cstring strdesc("total");

trace("count =%d,description =%s/n",ncount,strdesc); …

可以看到,

trace

語句的工作方式有點像

c語言中的

printf

語句,trace

巨集引數的個數是可變的,因此使用起來非常容易。如果檢視

mfc的源**,你根本找不到

trace

巨集,而只能看到

trace0

、trace1

、trace2

和trace3

巨集,它們的引數分別為0、

1、2、

3。  

二、

assert

巨集

如果你設計了乙個函式,該函式需要乙個指向文件物件的指標做引數,但是你卻錯誤地用乙個檢視指標呼叫了這個函式。這個假的位址將導致視資料的破壞。現在,這種型別的問題可以被完全避免,只要在該函式的開始處實現乙個

assert

測試,用來檢測該指標是否真正指向乙個文件物件。一般來講,程式設計者在每個函式的開始處均應例行公事地使用

assertion

。assert

巨集將會判斷表示式,如果乙個表示式為真,執行將繼續,否則,程式將顯示一條訊息並且暫停,你可以選擇忽視這條錯誤並繼續、終止這個程式或者是跳到

debug

器中。下面一例演示了如何使用乙個

assert

巨集去驗證乙個語句。

void foo( char

p, int size )

這些語句不產生任何**,除非—

debug

處理器標誌被設定。

visual c

++只在

debug

版本設定這些標誌,而在

release

版本不定義這些標誌。當—

debug

被定義時,兩個

assertions

將產生如下**:

//assert( p != 0 ); do

while(0);

//assert((size

〉= 100); do

while(0);

do-while

迴圈將整個

assertion

封裝在乙個單獨的程式塊中,使得編譯器編譯起來很舒暢。

if語句將求取表示式的值並且當結果為零時呼叫

afxassertfailedline()

函式。這個函式將彈出乙個對話方塊,其中提供三個選項「取消、重試或忽略」,當你選取「重試」時,它將返回

true

。重試將導致對

afxdebugbreak()

函式的呼叫,從而啟用偵錯程式。

do-while

迴圈將整個

assertion

封裝在乙個單獨的程式塊中,使得編譯器編譯起來很舒暢。

if語句將求取表示式的值並且當結果為零時呼叫

afxassertfailedline()

函式。這個函式將彈出乙個對話方塊,其中提供三個選項「取消、重試或忽略」,當你選取「重試」時,它將返回

true

。重試將導致對

afxdebugbreak()

函式的呼叫,從而啟用偵錯程式。

afxassertfailedline()

是乙個未正式公布的函式,它的功能就是顯示乙個訊息框。該函式的源**駐留在

afxasert.cpp

中。函式中的—

file

—和—line

—語句是處理器標誌,它們分別指定了源檔名和當前的行號。

afxassertfailedline()

是乙個未正式公布的函式,它的功能就是顯示乙個訊息框。該函式的源**駐留在

afxasert.cpp

中。函式中的—

file

—和—line

—語句是處理器標誌,它們分別指定了源檔名和當前的行號。  

三、

verify

巨集

因為assertion

只能在程式的

debug

版本中起作用,在表示式中不可以包含賦值語句、增加語句(++)或者是減少語句(--),因為,這些語句實際改變資料。可有時你可能想要驗證乙個能動的表示式,使用乙個賦值語句。那麼就到了用

verify

巨集來替代

assert

。例如:  

void foo(char

p, int size )

在debug

模式下,

assert

和verify

是一回事,但是在

release

模式下,

verify

巨集仍然測試表示式而

assertion

卻不起任何作用。可以說,在

release

模式下,

assert

語句被刪除了。

請注意,如果你在乙個

assert

語句中錯誤地使用了乙個能動的表示式,編譯器將不做任何警告地忽略它。在

release

模式下,該表示式就會被無聲息地刪除掉,這將會導致程式的錯誤執行。由於

release

版的程式通常不包含

debug

資訊,這類錯誤將很難被發現。

VC除錯資訊輸出 TRACE巨集

trace巨集對於vc下程式除錯來說是很有用的東西,有著類似printf的功能 該巨集僅僅在程式的debug版本中出現,當release的時候該巨集就完全消失了,從而幫助你除錯也在release的時候減少 量。使用非常簡單,格式如下 trace ddddddddddd trace wewe d 33...

vc中 T L巨集的用法

1 在字串前加乙個l作用 如 l 我的字串 表示將ansi字串轉換成unicode的字串,就是每個字元占用兩個位元組。strlen asd 3 strlen l asd 6 2 t巨集可以把乙個引號引起來的字串,根據你的環境設定,使得編譯器會根據編譯目標環境選擇合適的 unicode還是ansi 字...

VC中TRACE巨集的用法

trace巨集對於vc下程式除錯來說是很有用的東西,有著類似printf的功能 該巨集僅僅在程式的debug版本中出現,當release的時候該巨集就完全消失了,從而幫助你除錯也在release的時候減少 量。使用非常簡單,格式如下 trace ddddddddddd trace wewe d 33...