C 使用斷言

2021-09-06 10:24:07 字數 1279 閱讀 5533

程式一般分為debug版本和release版本,debug版本用於內部除錯,release版本發行給使用者使用。

斷言assert是僅在debug版本起作用的巨集,它用於檢查「不應該」發生的情況。示例6-5是乙個記憶體複製函式。在執行過程中,如果assert的引數為假,那麼程式就會中止(一般地還會出現提示對話,說明在什麼地方引發了assert)。

void  *memcpy(void *pvto, const void *pvfrom, size_t size)

示例6-5 複製不重疊的記憶體塊

assert不是乙個倉促拼湊起來的巨集。為了不在程式的debug版本和release版本引起差別,assert不應該產生任何***。所以assert不是函式,而是巨集。程式設計師可以把assert看成乙個在任何系統狀態下都可以安全使用的無害測試手段。如果程式在assert處終止了,並不是說含有該assert的函式有錯誤,而是呼叫者出了差錯,assert可以幫助我們找到發生錯誤的原因。

很少有比跟蹤到程式的斷言,卻不知道該斷言的作用更讓人沮喪的事了。你化了很多時間,不是為了排除錯誤,而只是為了弄清楚這個錯誤到底是什麼。有的時候,程式設計師偶爾還會設計出有錯誤的斷言。所以如果搞不清楚斷言檢查的是什麼,就很難判斷錯誤是出現在程式中,還是出現在斷言中。幸運的是這個問題很好解決,只要加上清晰的注釋即可。這本是顯而易見的事情,可是很少有程式設計師這樣做。這好比乙個人在森林裡,看到樹上釘著一塊「危險」的大牌子。但危險到底是什麼?樹要倒?有廢井?有野獸?除非告訴人們「危險」是什麼,否則這個警告牌難以起到積極有效的作用。難以理解的斷言常常被程式設計師忽略,甚至被刪除。[maguire, p8-p30]

【規則6-5-1使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,後者是必然存在的並且是一定要作出處理的。

【規則6-5-2】在函式的入口處,使用斷言檢查引數的有效性(合法性)。

【建議6-5-1在編寫函式時,要進行反覆的考查,並且自問:「我打算做哪些假定?」一旦確定了的假定,就要使用斷言對假定進行檢查。

【建議6-5-2一般教科書都鼓勵程式設計師們進行防錯設計,但要記住這種程式設計風格可能會隱瞞錯誤。當進行防錯設計時,如果「不可能發生」的事情的確發生了,則要使用斷言進行報警。

C 斷言使用

程式一般分為debug和release版本,debug版本用於內部測試,release版本發行給使用者使用。斷言assert是僅在debug版本起作用的巨集,它用於檢查不應該發生的情況。在執行過程中,如果assert的引數為假,那麼程式就會中止 一般地還會出現提示對話,說明在什麼地方引發了asser...

原 C斷言 靜態斷言

關於斷言,可以作為一種很強大的除錯方式或者程式執行時的錯誤診斷 但是斷言也不是適合於各種地方,伺服器軟體和嵌入式程式一般不適用,斷言會強制中斷正在執行的程式,對於伺服器等程式來說,將會是乙個災難。加上,斷言會加劇cpu 的負載,其中會呼叫一些函式。作為除錯時使用斷言是個不錯的選擇 一般斷言 ifnd...

C 斷言與靜態斷言 1

c 斷言與靜態斷言 斷言是很早之前就有的東西了,只需要引入cassert標頭檔案即可使用。往往assert被用於檢查不可能發生的行為,來確保開發者在除錯階段盡早發現 不可能 事件真的發生了,如果真的發生了,那麼就表示 的邏輯存在問題。最好的一點就是,斷言只在debug中生效,因此對於release版...