在
vc++
中使用斷言
斷言是乙個巨集,格式為
:assert(
邏輯表示式
booleanexpression)
邏輯表示式可以是任意乙個表示式,其值是0或者非0。
從程式碼的可讀性角度來講,這個表示式應該是不包含與布林型變數的邏輯比較操作的。
斷言僅僅在
debug
過程中產生作用。
當邏輯表示式出現了
false(0)
的時候,編譯程式將自動停止程式的執行,並給出相關的程式診斷資訊。 對於
release
版本的程式碼,
assert
巨集不會被處理,因而不會對程式的正常執行其任何阻攔作用。對於
mfc,假如希望在
release
版本中依然有類似的功能,可以使用
verify
巨集。該巨集作用和斷言類似。
assertion failed in file
in line
以上為診斷資訊的格式。其中
file name
代表了出錯程式程式碼所在的檔案,
line number
是該出現問題的斷言所在行。
可以檢查函式引數的合理性。
在實際工作中,有些函式需要輸入引數滿足一些假定條件,而這些約束條件不是資料型別可以滿足的。比如下面的程式碼,要根據三個邊長求乙個直角三角形的某些引數,必須確認這三個邊長是合理的。
type getvalue(int a, int b, int c)
在這裡,斷言第三個引數必須是最大的邊長,之後,進一步要求兩個短邊的平方和必須等於長邊的平方。
類似的,我們可以用判斷主調給出的指標是否有效。 ……
assert(null != poutbuffer)
…...
在函式內檢測引數的合理性有兩個好處:
1 保證函式本身的健壯性;
2 使問題容易定位。
主調給出的引數有時候可能是莫名其妙的,使用斷言,能夠發現許多難以發現的邏輯錯誤。
在mfc
中,由於
windows
的虛擬記憶體,
release
以後的程式是不可能耗盡記憶體的。因此,如果用普通程式碼檢查分配記憶體成功與否,效率是不合算的,最好使用斷言。 例如
: ……
pbuf = (char *) malloc( sizeof(char) * 100 );
assert( null != pbuf ) ……
這樣既不降低碼執行效率,又能檢查分配記憶體是否成功。
大概在定義指標的時候人人都懂得初始化吧:
int *pcount = null;
然後分配空間,
pcount = new int[ 10 ];
process… ?
之後釋放空間:
delete pcount;
這時候,
pcount
指向哪裡呢
? 還是原來的位址,然而改位址已經被系統釋放了,於是這個指標就變成了
」野指標
」,如果使用,必然導致錯誤。在這裡,應該使用斷言來確保賦了
null值。
pcount = null;
? ……
? assert ( null == pcount ); //if you』ve forgotten delete,here will output an alart. ?
牢記,在給乙個指標釋放空間之後用斷言確保這個指標已經賦了
null
,以免出現野指標。
// example for assert
cage* pcage = new cage[ 21 ]; // cage is derived from cobject.
assert( pcage!= null )
assert( pcage->iskindof( runtime_class( cage ) ) )
// terminates program only if pcage is not a cage*.以上為
msdn
中對於斷言使用的範例,在這裡確保了
pcage
指向的物件是有效的
cage類。
1 斷言捕捉的是非法操作的情況,而不是錯誤。不要試圖用斷言來排錯。
2 一旦函式對引數有任何假定,一定要在函式的入口處使用斷言來確認假定是否實現。
3 給每乙個斷言加上注釋,以便使斷言有目的的防錯。 ?
參考資料
1 steve maguire, writing clean code. 2
林銳,高質量c/c++
程式設計指南
3 microsoft,msdn document ?
v1.0 2003/9/9
在VC中使用CCheckListBox
在軟體應用中經常會遇到需要複選功能的列表框。類cchecklistbox實現了windows複選列表框。複選列表框顯示項的乙個列表,例如檔名列表。列表中的每項都有乙個核取方塊,方便使用。但是vc的控 件列表中並新增cchecklistbox,因此在使用cchecklistbox還要進行一些手動設定,...
在VC中使用Debug
選定debug編譯選項 build set active configuration win32 debug 或者在build工具欄上的listbox中選擇debug。debug定義了 debug巨集,而release定義了ndebug巨集。先按f12編譯browse資訊 這樣編譯後可以查到變數定義...
在VC中使用GDI
gdi 可應用於二維向量圖象,柵格圖象及排版,是為c c 程式設計師而設計的表現為c 類而存在的介面,能用於一切基於windows的應用中。作為gdi的後繼者,gdi 在gdi中增加了新功能,如文字的反鋸齒,漸變筆刷,alpha溶合 也優化了gdi許多已有的功能。此外,gdi 改變了程式設計模式,使...