青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

assert() 函數(shù)用法

Posted on 2011-04-20 21:18 RTY 閱讀(1037) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++

assert宏的原型定義在assert.h中,其作用是如果它的條件返回錯(cuò)誤,則終止程序執(zhí)行.
  原型定義:

顯示代碼打印1   #include "assert.h" 

2   void assert( int expression );


  assert的作用是現(xiàn)計(jì)算表達(dá)式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,然后通過調(diào)用 abort 來終止程序運(yùn)行。
  
  請(qǐng)看下面的程序清單badptr.c:

顯示代碼打印01   #include  

02   #include  

03   #include  

04   int main( void )  

05   {  

06    FILE *fp;  

07     

08    fp = fopen( "test.txt", "w" );//以可寫方式打開一個(gè)文件,如果不存在就創(chuàng)建一個(gè)同名文件  

09    assert( fp ); //所以這里不會(huì)出錯(cuò)  

10    fclose( fp );  

11     

12    fp = fopen("noexitfile.txt", "r" );//以只讀方式打開一個(gè)文件,如果不存在就打開文件失敗  

13    assert( fp ); //所以這里出錯(cuò)  

14    fclose( fp ); //程序永遠(yuǎn)都執(zhí)行不到這里來  

15     

16    return 0;  

17   }


  
  使用assert的缺點(diǎn)是,頻繁的調(diào)用會(huì)極大的影響程序的性能,增加額外的開銷。
  在調(diào)試結(jié)束后,可以通過在包含#include 的語句之前插入 #define NDEBUG 來禁用assert調(diào)用,示例代碼如下:

顯示代碼打印1   #include  

2   #define NDEBUG  

3   #include


  
  用法總結(jié)與注意事項(xiàng):
  1)在函數(shù)開始處檢驗(yàn)傳入?yún)?shù)的合法性
  如:
  

顯示代碼打印01   int resetBufferSize(int nNewSize)  

02   {  

03   //功能:改變緩沖區(qū)大小,  

04   //參數(shù):nNewSize 緩沖區(qū)新長(zhǎng)度  

05   //返回值:緩沖區(qū)當(dāng)前長(zhǎng)度  

06   //說明:保持原信息內(nèi)容不變 nNewSize<=0表示清除緩沖區(qū)  

07   assert(nNewSize >= 0);  

08   assert(nNewSize <= MAX_BUFFER_SIZE);  

09     

10   ...  

11   }


  
  2)每個(gè)assert只檢驗(yàn)一個(gè)條件,因?yàn)橥瑫r(shí)檢驗(yàn)多個(gè)條件時(shí),如果斷言失敗,無法直觀的判斷是哪個(gè)條件失敗
  
  不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
  
  好: assert(nOffset >= 0);
  assert(nOffset+nSize <= m_nInfomationSize);
  
  
  3)不能使用改變環(huán)境的語句,因?yàn)閍ssert只在DEBUG個(gè)生效,如果這么做,會(huì)使用程序在真正運(yùn)行時(shí)遇到問題
  錯(cuò)誤: assert(i++ < 100)
  這是因?yàn)槿绻鲥e(cuò),比如在執(zhí)行之前i=100,那么這條語句就不會(huì)執(zhí)行,那么i++這條命令就沒有執(zhí)行。
  正確: assert(i < 100)
   i++;
  
  4)assert和后面的語句應(yīng)空一行,以形成邏輯和視覺上的一致感
  
  5)有的地方,assert不能代替條件過濾
  
  #C++
  
  程序一般分為Debug 版本和Release 版本,Debug 版本用于內(nèi)部調(diào)試,Release 版本發(fā)行給用戶使用。斷言assert 是僅在Debug 版本起作用的宏,它用于檢查“不應(yīng)該”發(fā)生的情況。以下是一個(gè)內(nèi)存復(fù)制程序,在運(yùn)行過程中,如果assert 的參數(shù)為假,那么程序就會(huì)中止(一般地還會(huì)出現(xiàn)提示對(duì)話,說明在什么地方引發(fā)了assert)。

顯示代碼打印01   //復(fù)制不重疊的內(nèi)存塊  

02   void memcpy(void *pvTo, void *pvFrom, size_t size)  

03   {  

04   void *pbTo = (byte *) pvTo;  

05   void *pbFrom = (byte *) pvFrom;  

06   assert( pvTo != NULL && pvFrom != NULL );  

07   while(size - - > 0 )  

08   *pbTo + + = *pbFrom + + ;  

09   return (pvTo);  

10   }


  
  assert 不是一個(gè)倉促拼湊起來的宏,為了不在程序的Debug 版本和Release 版本引起差別,assert 不應(yīng)該產(chǎn)生任何副作用。所以assert 不是函數(shù),而是宏。程序員可以把a(bǔ)ssert 看成一個(gè)在任何系統(tǒng)狀態(tài)下都可以安全使用的無害測(cè)試手段。
  
  很少有比跟蹤到程序的斷言,卻不知道該斷言的作用更讓人沮喪的事了。你化了很多時(shí)間,不是為了排除錯(cuò)誤,而只是為了弄清楚這個(gè)錯(cuò)誤到底是什么。有的時(shí)候,程序員偶爾還會(huì)設(shè)計(jì)出有錯(cuò)誤的斷言。所以如果搞不清楚斷言檢查的是什么,就很難判斷錯(cuò)誤是出現(xiàn)在程序中,還是出現(xiàn)在斷言中。幸運(yùn)的是這個(gè)問題很好解決,只要加上清晰的注釋即可。這本是顯而易見的事情,可是很少有程序員這樣做。這好比一個(gè)人在森林里,看到樹上釘著一塊“危險(xiǎn)”的大牌子。但危險(xiǎn)到底是什么?樹要倒?有廢井?有野獸?除非告訴人們“危險(xiǎn)”是什么,否則這個(gè)警告牌難以起到積極有效的作用。難以理解的斷言常常被程序員忽略,甚至被刪除。 [Maguire 1993]
  
  以下是使用斷言的幾個(gè)原則:
  
  (1)使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯(cuò)誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。
  
  (2)使用斷言對(duì)函數(shù)的參數(shù)進(jìn)行確認(rèn)。
  
  (3)在編寫函數(shù)時(shí),要進(jìn)行反復(fù)的考查,并且自問:“我打算做哪些假定?”一旦確定了的
  假定,就要使用斷言對(duì)假定進(jìn)行檢查。
  
  (4)一般教科書都鼓勵(lì)程序員們進(jìn)行防錯(cuò)性的程序設(shè)計(jì),但要記住這種編程風(fēng)格會(huì)隱瞞錯(cuò)誤。當(dāng)進(jìn)行防錯(cuò)性編程時(shí),如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進(jìn)行報(bào)警。
 
ASSERT ()是一個(gè)調(diào)試程序時(shí)經(jīng)常使用的宏,在程序運(yùn)行時(shí)它計(jì)算括號(hào)內(nèi)的表達(dá)式,如果表達(dá)式為FALSE (0), 程序?qū)?bào)告錯(cuò)誤,并終止執(zhí)行。如果表達(dá)式不為0,則繼續(xù)執(zhí)行后面的語句。這個(gè)宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時(shí)也便于查找錯(cuò)誤。 

ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。 
---------------------------------------------------------------

ASSERT宏定義如下 


顯示代碼打印1 #define ASSERT(f)  

2 do 

3 {  

4        if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__))  

5                AfxDebugBreak();  

6 } while (0)


ASSERT(邏輯表達(dá)式)

如果括號(hào)中的邏輯表達(dá)式值為假的話,會(huì)彈出調(diào)試命令窗口,提示具體在哪個(gè)文件的哪一行發(fā)生了斷言錯(cuò)誤! 
---------------------------------------------------------------

ASSERT
Evaluates an expression, and displays a diagnostic message if the expression is FALSE. Ignored in retail builds.

Syntax

ASSERT(
       cond
);

Parameters

cond

Expression to evaluate.

Remarks

In debug builds, if the expression is FALSE, this macro displays a message box with the text of the expression, the name of the source file, and the line number. The user can ignore the assertion, enter the debugger, or quit the application.

Example

ASSERT(rtStartTime <= rtEndTime);


---------------------------------------------------------------

斷言(ASSERT)的使用,方法很簡(jiǎn)單。為什么要用,初學(xué)者可能比較迷惑。 
契約式編程講的比較清楚,建議可以先看看這類書。 
一個(gè)函數(shù)由前置條件、后置條件和不變式組成。在VC中,我們可以通過斷言來保證這三個(gè)條件。可以大大提高了軟件的質(zhì)量。 
---------------------------------------------------------------

如果ASSERT()中的條件不成立(比如 ASSERT(0) ;     ),會(huì)彈出一個(gè)比較嚇人的對(duì)話框。 

點(diǎn)擊重試,可以到達(dá) ASSERT 斷言不成立的那一行, 

此時(shí)可以在watch窗口查看變量值,找出出錯(cuò)的原因。 

如果程序能夠繼續(xù)運(yùn)行,可以按F5繼續(xù)調(diào)試。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲九九精品| 国产欧美日本在线| 国产精品久久久久久福利一牛影视 | 欧美日韩综合在线| 亚洲影视在线| 午夜精品理论片| 国产亚洲欧美日韩美女| 免费观看一级特黄欧美大片| 欧美gay视频激情| 午夜精品短视频| 亚洲女女女同性video| 亚洲午夜av| 国产伦精品免费视频| 久久另类ts人妖一区二区| 欧美搞黄网站| 久久免费99精品久久久久久| 蜜桃av噜噜一区| 亚洲一区影院| 久久精品国产2020观看福利| 日韩午夜剧场| 久久综合色88| 久久久免费观看视频| 欧美日韩精品免费| 欧美国产综合视频| 黄色小说综合网站| 亚洲欧美日韩综合国产aⅴ| 日韩午夜在线视频| 欧美激情一区二区三区在线| 欧美v国产在线一区二区三区| 国产美女扒开尿口久久久| 99视频精品在线| 一区二区三区av| 欧美国产日韩一区二区三区| 欧美黑人在线播放| 亚洲精品综合精品自拍| 欧美日韩国产999| 国产精品久久久久久超碰| 亚洲人成网站在线观看播放| 国产在线精品二区| 久久免费精品日本久久中文字幕| 亚洲伦理在线观看| 亚洲一区观看| 欧美主播一区二区三区美女 久久精品人 | 欧美一区二区三区播放老司机| 在线一区二区三区四区| 国产精品久久久久高潮| 你懂的视频欧美| 国产精品激情电影| 久久天天综合| 国产精品日韩在线观看| 亚洲综合三区| 欧美不卡一卡二卡免费版| 亚洲激情在线观看视频免费| 久久亚洲捆绑美女| 久久国产福利| 亚洲精品国产拍免费91在线| 欧美三区在线视频| 性色av香蕉一区二区| 久久亚洲影音av资源网| 激情成人在线视频| 欧美韩国在线| 亚洲欧美一区二区原创| 欧美一区二区三区四区在线 | 欧美激情黄色片| 99re8这里有精品热视频免费| 午夜久久一区| 亚洲成人在线网| 欧美日韩成人一区二区三区| 欧美国产精品va在线观看| 日韩视频永久免费| 激情亚洲一区二区三区四区| 欧美日本韩国一区| 最近中文字幕日韩精品 | 99riav久久精品riav| 国产精品视频一区二区三区| 久久久综合香蕉尹人综合网| 亚洲欧美中文日韩v在线观看| 亚洲区第一页| 亚洲大片免费看| 欧美第一黄色网| 亚洲三级影片| 久久久一本精品99久久精品66| 亚洲欧美国产一区二区三区| 99精品视频网| 精品动漫3d一区二区三区免费版| 国产精品专区第二| 国产一区二三区| 在线观看欧美| 很黄很黄激情成人| 影院欧美亚洲| 99国产精品久久| 亚洲日本va午夜在线影院| 亚洲国产高清在线| 亚洲人成啪啪网站| 亚洲欧洲精品一区二区三区| 最新国产乱人伦偷精品免费网站| 亚洲高清在线播放| 日韩小视频在线观看| 亚洲一区美女视频在线观看免费| 91久久中文| 欧美在线免费视屏| 亚洲国产成人高清精品| 一本到高清视频免费精品| 欧美在线免费视屏| 欧美一激情一区二区三区| 久久久久国色av免费看影院| 欧美日韩视频在线一区二区观看视频| 欧美视频一区二区三区…| 欧美日韩亚洲免费| 亚洲第一精品夜夜躁人人爽| 亚洲视频欧美在线| 久久久欧美精品| 亚洲综合精品自拍| 久久精品欧美| 国产欧美一区二区精品忘忧草| 日韩亚洲视频在线| 久久蜜桃精品| 韩国福利一区| 欧美成年人在线观看| 国产精品福利在线观看| 亚洲国产导航| 欧美成人一区在线| 亚洲一级黄色av| 国产精品超碰97尤物18| av不卡在线| 欧美成人免费全部观看天天性色| 香蕉尹人综合在线观看| 韩国福利一区| 欧美一区二区三区四区高清| 一区二区三区久久| 欧美性猛交xxxx乱大交蜜桃| 亚洲国产精品99久久久久久久久| 免费在线看一区| 欧美国产精品v| 亚洲破处大片| 最新国产の精品合集bt伙计| 欧美大片在线观看| 欧美大片在线看| 亚洲免费精彩视频| 亚洲伦理在线免费看| 国产精品每日更新在线播放网址| 在线综合+亚洲+欧美中文字幕| 亚洲精品国产精品国自产观看浪潮 | 国产乱子伦一区二区三区国色天香| 欧美一区二区三区久久精品| 久久精品免费观看| 亚洲乱码国产乱码精品精| 亚洲一区二区免费看| 国产精品国产三级国产aⅴ入口| 亚洲精品网址在线观看| 裸体歌舞表演一区二区| 久久一区中文字幕| 久久精品成人欧美大片古装| 午夜欧美不卡精品aaaaa| 一区二区三区在线免费观看| 中文精品在线| 午夜久久tv| 亚洲性夜色噜噜噜7777| 久久久欧美精品sm网站| 亚洲精品久久久久久久久| 新狼窝色av性久久久久久| 亚洲一区二区三区高清 | 性xx色xx综合久久久xx| 亚洲国产日韩在线一区模特| 亚洲私人影院| 亚洲一区激情| 国产精品久久久久久久浪潮网站 | 久久久久一本一区二区青青蜜月| 欧美午夜激情在线| 99精品国产99久久久久久福利| 日韩亚洲国产欧美| 国产精品午夜电影| 久久久777| 99精品福利视频| 久久性天堂网| 亚洲精品国久久99热| 国产精品v欧美精品∨日韩| 亚洲一区自拍| 老司机精品久久| 亚洲精品日韩欧美| 欧美日韩一级黄| 一个色综合导航| 裸体丰满少妇做受久久99精品| 亚洲风情亚aⅴ在线发布| 欧美老女人xx| 久久久久9999亚洲精品| 中文av一区特黄| 亚洲福利专区| 蜜桃伊人久久| 久久9热精品视频| 在线日韩中文字幕| 久久成人免费网| 艳女tv在线观看国产一区| 久久精品日韩| 亚洲嫩草精品久久| 99国产一区二区三精品乱码| 国产精品久线观看视频| 蜜臀91精品一区二区三区| 欧美一区成人| 99国产一区|