- 相關(guān)推薦
C語言的assert斷言宏
大家在學(xué)習(xí)C語言的時(shí)候?qū)τ赼ssert斷言宏了解多少呢?今天小編要為大家?guī)淼氖荂語言的assert斷言宏的相關(guān)知識(shí),希望可以在大家學(xué)習(xí)C語言的時(shí)候有所幫助,一起來看看吧!
assert宏的原型定義在中,其作用是如果它的條件返回錯(cuò)誤,則終止程序執(zhí)行,原型定義:
#include
void assert( int expression );
assert的作用是現(xiàn)計(jì)算表達(dá)式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,然后通過調(diào)用 abort 來終止程序運(yùn)行。
如果assert()終止了程序,它首先會(huì)顯示失敗的測(cè)試、包含測(cè)試的文件名和行號(hào)。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* assert.c -- use assert() */ #include #include #include int main() { double x, y, z; puts( "Enter a pair of numbers (0 0 to quit): " ); while (scanf( "%lf%lf" , &x, &y) == 2 && (x != 0 || y != 0 )) { z = x * x - y * y; /* should be + */ assert (z >= 0 ); printf( "answer is %f
" , sqrt(z)); puts( "Next pair of numbers: " ); } puts( "Done" ); return 0 ; } |
下面是該程序的運(yùn)行示例:
1 | Enter a pair of numbers ( 0 0 to quit): |
4 3 [用戶輸入]
1 2 3 | answer is 2.645751 Next pair of numbers: |
5 3 [用戶輸入]
1 2 3 | answer is 4.000000 Next pair of numbers: |
3 5 [用戶輸入]
1 | assertion "z >= 0" failed: file "assert.c" , line 14 , function: main |
該程序在求平方根之前,該程序斷言z是否大于0或等于0。程序還錯(cuò)誤地減去一個(gè)值而不是加上一個(gè)值,故意讓z得不到合適的值。
具體的錯(cuò)誤提示音編譯器而異。這條消息指明的是沒有滿足z>=0的條件。
用if語句也能完成類似的任務(wù):
1 2 3 4 5 6 7 8 9 | if (z< 0 ) { puts( "z less than 0" ); abort(); } |
但是使用asset()有幾個(gè)好處:它不僅能自動(dòng)標(biāo)識(shí)文件和出問題的行號(hào),還有一種無需修改代碼就能開啟或關(guān)閉assert()的機(jī)制。在調(diào)試結(jié)束后,可以通過在包含#include 的語句之前插入#define NDEBUG來禁用assert調(diào)用,示例代碼如下:
1 2 3 4 5 | #include #define NDEBUG #include |
重新編譯程序,這樣編譯器就會(huì)禁用文件中的所有assert()語句。如果程序又出現(xiàn)問題,可以移除這條#define NDEBUG指令,或者把它注釋掉,然后重新編譯,這樣就重新啟用了assert()語句了。
使用assert的缺點(diǎn)是,頻繁的調(diào)用會(huì)極大的影響程序的性能,增加額外的開銷。
一些建議:
使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯(cuò)誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。 在函數(shù)的入口處,使用斷言檢查參數(shù)的有效性(合法性)。 在編寫函數(shù)時(shí),要進(jìn)行反復(fù)的考查,并且自問:“我打算做哪些假定?”一旦確定了的假定,就要使用斷言對(duì)假定進(jìn)行檢查。 一般教科書都鼓勵(lì)程序員們進(jìn)行防錯(cuò)設(shè)計(jì),但要記住這種編程風(fēng)格可能會(huì)隱瞞錯(cuò)誤。當(dāng)進(jìn)行防錯(cuò)設(shè)計(jì)時(shí),如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進(jìn)行報(bào)警。
【C語言的assert斷言宏】相關(guān)文章:
C語言的基本構(gòu)成12-05
c語言的優(yōu)點(diǎn)介紹04-13
C語言試題訓(xùn)練10-20
C語言入門知識(shí)07-20
C語言的編碼規(guī)范02-10
C語言跳出循環(huán)10-16
C語言考點(diǎn)習(xí)題09-28
什么是C語言數(shù)組04-15
C語言程序的實(shí)現(xiàn)09-27