用法總結與注意事項:
1)在函式開始處檢驗傳入引數的合法性
如:
int resetbuffersize(int nnewsize)
2)每個
assert
只檢驗乙個條件
,因為同時檢驗多個條件時
,如果斷言失敗
,無法直觀的判斷是哪個條件失敗
不好: assert(noffset>=0 && noffset+nsize<=m_ninfomationsize);
好: assert(noffset >= 0);
assert(noffset+nsize <= m_ninfomationsize);
3)不能使用改變環境的語句,因為
assert
只在debug
個生效,
如果這麼做
,會使用程式在真正執行時遇到問題
錯誤: assert(i++ < 100)
這是因為如果出錯,比如在執行之前i=100,
那麼這條語句就不會執行,那麼
i++這條命令就沒有執行。
正確: assert(i < 100)
i++;
4)assert和後面的語句應空一行
,以形成邏輯和視覺上的一致感
5)有的地方
,assert
不能代替條件過濾
程式一般分為debug
版本和release
版本,debug
版本用於內部除錯,
release
版本發行給使用者使用。
斷言assert
是僅在debug
版本起作用的巨集,它用於檢查
「不應該
」發生的情況。示例
6-5
是乙個記憶體複製函式。在執行過程中,如果
assert
的引數為假,那麼程式就會中止(一般地還會出現提示對話,說明在什麼地方引發了
assert
)。
void *memcpy(void *pvto, const void *pvfrom, size_t size)
【規則6-5-1
】使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,後者是必然存在的並且是一定要作出處理的。
【規則6-5-2
】在函式的入口處,使用斷言檢查引數的有效性(合法性)。
【建議6-5-1
】在編寫函式時,要進行反覆的考查,並且自問:
「我打算做哪些假定?
」一旦確定了的假定,就要使用斷言對假定進行檢查。
【建議6-5-2
】一般教科書都鼓勵程式設計師們進行防錯設計,但要記住這種程式設計風格可能會隱瞞錯誤。當進行防錯設計時,如果
「不可能發生
」的事情的確發生了,則要使用斷言進行報警。
assert巨集中應該包含的元素:
判斷條件;輸出當前斷言失敗的位置(檔案、行數等);返回錯誤;終止程式...
文章出處:
C ASSERT 斷言機制
c assert 斷言機制 assert 是乙個除錯程式時經常使用的巨集,在程式執行時它計算括號內的表示式,如果表示式為false 0 程式將報告錯誤,並終止執行。如果表示式不為0,則繼續執行後面的語句。這個巨集通常原來判斷程式中是否出現了明顯非法的資料,如果出現了終止程式以免導致嚴重後果,同時也便...
Select歸納總結
include include int select int maxfdpl,fd set readset,fd set write,fd set exceptset,const struct timeval timeout 返回值 該函式的返回值表示跨所有描述符集的已就緒的總位數。如果在任何描述符...
Poll歸納總結
include int poll struct pollfd fd,nfds t nfds,int timeout 返回 若有就緒操作符則為其數目。若超時則為0。若 出錯則為 1。第乙個引數是指向乙個結構陣列第乙個陣列元素的指標,每個陣列元素都是乙個pollfd結構,用於指定測試某個給定描述符發的的...