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

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

assert() 函數(shù)用法

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

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

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

2   void assert( int expression );


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

顯示代碼打印01   #include  

02   #include  

03   #include  

04   int main( void )  

05   {  

06    FILE *fp;  

07     

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

09    assert( fp ); //所以這里不會出錯  

10    fclose( fp );  

11     

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

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

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

15     

16    return 0;  

17   }


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

顯示代碼打印1   #include  

2   #define NDEBUG  

3   #include


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

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

02   {  

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

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

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

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

07   assert(nNewSize >= 0);  

08   assert(nNewSize <= MAX_BUFFER_SIZE);  

09     

10   ...  

11   }


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

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

ASSERT宏定義如下 


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

2 do 

3 {  

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

5                AfxDebugBreak();  

6 } while (0)


ASSERT(邏輯表達式)

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

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)的使用,方法很簡單。為什么要用,初學(xué)者可能比較迷惑。 
契約式編程講的比較清楚,建議可以先看看這類書。 
一個函數(shù)由前置條件、后置條件和不變式組成。在VC中,我們可以通過斷言來保證這三個條件??梢源蟠筇岣吡塑浖馁|(zhì)量。 
---------------------------------------------------------------

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

點擊重試,可以到達 ASSERT 斷言不成立的那一行, 

此時可以在watch窗口查看變量值,找出出錯的原因。 

如果程序能夠繼續(xù)運行,可以按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>
            欧美日韩喷水| 亚洲一区尤物| 亚洲欧美激情一区二区| 在线日韩av片| 亚洲午夜一二三区视频| 亚洲国产影院| 久久精彩免费视频| 羞羞答答国产精品www一本| 欧美成人午夜77777| 久久香蕉国产线看观看av| 欧美亚洲不卡| 日韩视频一区| 日韩亚洲在线观看| 久久夜色精品| 美女主播一区| 一区二区三区在线观看欧美| 午夜精品久久久久| 亚洲欧美一区二区在线观看| 欧美精品尤物在线| 亚洲国产岛国毛片在线| 一色屋精品视频免费看| 欧美一区二区三区免费看| 性久久久久久| 国产精品久久久久久久久| 日韩一级大片在线| 亚洲一区区二区| 国产精品igao视频网网址不卡日韩| 亚洲国产精品一区二区三区| 亚洲日本免费| 欧美激情一区二区三区蜜桃视频| 亚洲电影免费观看高清完整版| 亚洲电影成人| 欧美不卡在线视频| 亚洲黄色影片| 一区二区三区高清| 欧美视频免费在线观看| 在线亚洲欧美| 午夜在线观看欧美| 国精品一区二区三区| 久久精品亚洲一区二区| 欧美xart系列在线观看| 亚洲精品美女久久7777777| 欧美好骚综合网| 夜夜精品视频| 久久成人一区| 亚洲福利视频在线| 欧美经典一区二区三区| 在线一区二区三区四区| 欧美专区日韩专区| 亚洲大黄网站| 欧美日韩国产综合网 | 日韩一级欧洲| 欧美日韩中文在线观看| 亚洲欧美卡通另类91av | 欧美伊人久久久久久久久影院| 国产精品中文在线| 久久久av毛片精品| 亚洲国产一区在线| 亚洲欧美日韩中文播放| 红桃视频欧美| 欧美视频一区二区三区四区| 午夜精彩视频在线观看不卡 | 欧美国产一区在线| 亚洲一区二区视频| 韩日欧美一区二区三区| 欧美激情一区二区三区成人| 亚洲性感美女99在线| 你懂的视频一区二区| 亚洲网站啪啪| 亚洲电影视频在线| 国产精品久久久久一区| 久久亚洲欧洲| 亚洲欧美日韩区| 亚洲国产精品久久久久秋霞不卡| 亚洲欧美电影院| 亚洲欧洲日本国产| 国产亚洲一区二区三区在线播放 | 国产精品激情av在线播放| 久久精品一二三| 一区二区三区四区国产| 欧美高清视频一二三区| 欧美一区二区免费观在线| 亚洲日本中文字幕| 国内精品视频666| 国产精品久久久久国产精品日日 | 欧美视频官网| 美国十次成人| 欧美在线观看视频一区二区三区 | 最新成人av在线| 麻豆久久久9性大片| 午夜亚洲影视| 一区二区三区日韩在线观看| 136国产福利精品导航| 国产精品一区二区三区乱码| 欧美日韩国产一区精品一区| 美日韩在线观看| 久久精品国产清自在天天线| 亚洲欧美综合一区| 一区二区三区欧美日韩| 亚洲日本电影| 亚洲高清一区二区三区| 欧美大片在线观看一区二区| 老司机亚洲精品| 久久精品一级爱片| 久久精品最新地址| 久久激情综合网| 欧美一区二区视频观看视频| 亚洲欧美日韩精品久久| 亚洲午夜精品久久久久久app| 亚洲六月丁香色婷婷综合久久| 亚洲成人在线| 亚洲福利小视频| 在线播放日韩欧美| 亚洲国产精彩中文乱码av在线播放| 国产真实乱子伦精品视频| 国产亚洲综合精品| 国产在线一区二区三区四区| 国内精品99| 亚洲电影观看| 亚洲精品系列| 亚洲色无码播放| 午夜精品免费视频| 久久福利资源站| 久久男人av资源网站| 噜噜噜在线观看免费视频日韩 | 亚洲欧美日韩专区| 性久久久久久久久| 久久久久久久欧美精品| 美女主播精品视频一二三四| 亚洲盗摄视频| 亚洲另类自拍| 亚洲欧美日本精品| 久久久精品五月天| 欧美激情第一页xxx| 国产精品白丝jk黑袜喷水| 国产精品一区二区三区观看| 狠狠色丁香久久婷婷综合丁香| 亚洲国产成人久久综合一区| 亚洲最黄网站| 欧美一区二区三区久久精品| 美女精品在线| 亚洲精品久久在线| 午夜精品福利视频| 狂野欧美激情性xxxx欧美| 欧美日韩国产片| 国产欧美精品| 亚洲麻豆视频| 久久成人av少妇免费| 欧美国产精品中文字幕| 在线视频精品一| 久久免费偷拍视频| 国产精品久久久久aaaa| 伊人久久亚洲影院| 亚洲女女女同性video| 牛牛国产精品| 亚洲伊人观看| 欧美成人高清| 国产一区二区成人久久免费影院| 亚洲区中文字幕| 欧美一区二区在线观看| 亚洲国产视频一区| 久久国产精品久久久久久| 欧美日韩国产欧| 在线不卡欧美| 久久爱www久久做| 亚洲毛片视频| 免费精品视频| 国内精品亚洲| 欧美一级专区| 日韩一级黄色av| 欧美成人精品1314www| 国产一区二区三区在线观看网站| 亚洲日本中文字幕| 美女福利精品视频| 午夜视频一区在线观看| 欧美午夜片在线观看| 亚洲人成免费| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲视频在线免费观看| 欧美另类久久久品| 亚洲三级视频在线观看| 美女视频黄 久久| 欧美一区二区三区精品| 国产精品久久一区主播| 这里只有精品在线播放| 91久久精品一区二区别| 久久资源在线| 亚洲成人在线免费| 欧美**人妖| 久久精品国产v日韩v亚洲| 国产区亚洲区欧美区| 香蕉av777xxx色综合一区| 亚洲免费电影在线观看| 欧美伦理a级免费电影| 日韩一区二区精品在线观看| 亚洲黄一区二区三区| 欧美韩日一区二区| 99在线|亚洲一区二区| 亚洲破处大片| 欧美日韩免费观看一区|