斷言
所謂斷言,其實是防止程式意外出錯的一種宏,如果其參數計算為假,則程式發出警告,且退出。
最常見的用法就是在函式入口處保證輸入參數的正確性。
詳細
在 crtdefs.h 頭檔案中聲明為:#define ATLASSERT(expr) _ASSERTE(expr)
而_ASSERTE(expr)為:#define _ASSERTE(expr) _ASSERT_EXPR((expr), _CRT_WIDE(#expr))
--------------------------------------------------------------------------------------------------
簡單說就是:#define ATLASSERT(expr) _ASSERT_EXPR((expr), _CRT_WIDE(#expr))
其中_ASSERT_EXPR(A,B) 是用於根據A判斷是否以彈窗形式拋出B信息
而expr就是A,#expr就是B(注意:VC裡面會把預編譯中的#後面的占位符的值原封輸出。)
所以如果用ATLASSERT(!"ABCD");
就會出現如下彈窗(注意嘆號和雙引號都被顯示出來了~):
舉例
例如有一個單鍊表,無頭,單向不循環,結點含data,next,現在寫一個函式,獲取指針所指結點的下一個結點的data:
int GetNext(pNode* pn)
{
//如果為空,則出錯,因為沒有後續結點,沒有這一條的話如果傳入NULL則程式運行出錯
ATLASSERT(pn!= NULL)
return(pn->next->data);
}