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

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

assert() 函數用法

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

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

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

2   void assert( int expression );


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

顯示代碼打印01   #include  

02   #include  

03   #include  

04   int main( void )  

05   {  

06    FILE *fp;  

07     

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

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

10    fclose( fp );  

11     

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

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

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

15     

16    return 0;  

17   }


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

顯示代碼打印1   #include  

2   #define NDEBUG  

3   #include


  
  用法總結與注意事項:
  1)在函數開始處檢驗傳入參數的合法性
  如:
  

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

02   {  

03   //功能:改變緩沖區大小,  

04   //參數:nNewSize 緩沖區新長度  

05   //返回值:緩沖區當前長度  

06   //說明:保持原信息內容不變 nNewSize<=0表示清除緩沖區  

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)不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這么做,會使用程序在真正運行時遇到問題
  錯誤: assert(i++ < 100)
  這是因為如果出錯,比如在執行之前i=100,那么這條語句就不會執行,那么i++這條命令就沒有執行。
  正確: assert(i < 100)
   i++;
  
  4)assert和后面的語句應空一行,以形成邏輯和視覺上的一致感
  
  5)有的地方,assert不能代替條件過濾
  
  #C++
  
  程序一般分為Debug 版本和Release 版本,Debug 版本用于內部調試,Release 版本發行給用戶使用。斷言assert 是僅在Debug 版本起作用的宏,它用于檢查“不應該”發生的情況。以下是一個內存復制程序,在運行過程中,如果assert 的參數為假,那么程序就會中止(一般地還會出現提示對話,說明在什么地方引發了assert)。

顯示代碼打印01   //復制不重疊的內存塊  

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

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

ASSERT宏定義如下 


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

2 do 

3 {  

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

5                AfxDebugBreak();  

6 } while (0)


ASSERT(邏輯表達式)

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

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

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

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

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

如果程序能夠繼續運行,可以按F5繼續調試。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            最新亚洲一区| 欧美激情精品久久久久久大尺度| 91久久综合亚洲鲁鲁五月天| 可以免费看不卡的av网站| 国产综合欧美在线看| 久久亚洲国产精品一区二区| 欧美综合国产| 91久久在线播放| 亚洲免费大片| 欧美日韩一区二区在线播放| 亚洲欧美中文日韩在线| 欧美一级视频精品观看| 尤物yw午夜国产精品视频明星| 欧美69wwwcom| 欧美视频在线视频| 久久成人av少妇免费| 久久嫩草精品久久久久| 亚洲精品一区二区三区在线观看| 一区二区国产在线观看| 国产在线精品自拍| 亚洲国产欧美在线| 国产欧美日韩专区发布| 欧美好骚综合网| 国产精品免费一区二区三区观看| 久久天堂国产精品| 欧美日韩国产在线观看| 久久久福利视频| 欧美精品激情| 久久久久国产精品人| 欧美久久在线| 久久这里只精品最新地址| 欧美日韩国产999| 久久久午夜精品| 欧美日韩一区二区三区高清| 久久精品五月婷婷| 欧美日韩一二区| 嫩草成人www欧美| 国产精品五区| 亚洲精选国产| 亚洲国产成人精品视频| 亚洲一品av免费观看| 亚洲精品国久久99热| 欧美一区三区三区高中清蜜桃 | 一区二区三区你懂的| 一区二区三区亚洲| 亚洲视频久久| 99热这里只有成人精品国产| 欧美在线观看www| 午夜一区不卡| 欧美三级韩国三级日本三斤| 欧美韩日精品| 亚洲第一色在线| 久久精品国产视频| 欧美一区二区三区免费观看视频| 欧美日韩国产亚洲一区| 欧美激情精品久久久久久久变态| 国产综合色在线| 亚洲欧美日本国产有色| 亚洲女同同性videoxma| 欧美美女bb生活片| 亚洲欧洲在线看| 亚洲免费高清视频| 欧美成人亚洲成人| 亚洲高清在线观看一区| 亚洲国产高清在线观看视频| 久久久久国产精品厨房| 久热精品视频在线观看| 狠狠88综合久久久久综合网| 久久成人在线| 嫩模写真一区二区三区三州| 亚洲成色最大综合在线| 久久蜜桃av一区精品变态类天堂| 久久一区二区三区超碰国产精品| 韩国成人精品a∨在线观看| 欧美一区二区视频免费观看| 久久成人精品电影| 国语自产在线不卡| 久久综合中文| 亚洲啪啪91| 亚洲一区二区三区在线看| 欧美性事在线| 午夜精品久久久久久久99水蜜桃| 久久精品国产免费看久久精品| 国产人久久人人人人爽| 久久狠狠亚洲综合| 欧美国产成人在线| 99精品国产热久久91蜜凸| 欧美婷婷久久| 欧美中文在线观看国产| 欧美成人一区二区在线| 99re66热这里只有精品3直播| 欧美日韩小视频| 欧美中文在线观看国产| 亚洲国产高清一区| 亚洲主播在线| 在线视频国产日韩| 欧美日韩成人在线| 欧美一区二区三区免费大片| 亚洲电影在线看| 亚洲女人天堂av| 亚洲国产精品福利| 欧美午夜三级| 久久国产一区| 一本色道久久综合亚洲精品婷婷 | 久久精品日韩| 91久久久久久| 国产伦精品一区二区三区高清版 | 亚洲欧美日韩国产一区| 免费在线观看精品| 亚洲校园激情| 亚洲国产精品第一区二区三区| 欧美日韩在线一二三| 久久99伊人| 亚洲视频免费在线| 欧美激情中文字幕在线| 久久成人免费电影| 一卡二卡3卡四卡高清精品视频| 国产一区二区三区高清| 欧美日韩免费精品| 久久久亚洲国产天美传媒修理工| 亚洲深夜福利在线| 亚洲国产精品成人综合| 久久综合99re88久久爱| 亚洲在线免费| 夜夜精品视频一区二区| 在线国产欧美| 国语精品一区| 国产精品五区| 国产精品久久久久久久久久免费| 美女任你摸久久| 久久国产精品久久国产精品| 亚洲性视频h| 99精品国产高清一区二区| 亚洲国产美女精品久久久久∴| 久久噜噜噜精品国产亚洲综合| 亚洲欧美日本国产专区一区| av成人毛片| 亚洲毛片在线观看| 亚洲国产一区视频| 亚洲国产精品一区制服丝袜| 国产一级揄自揄精品视频| 国产精品一区二区久久久| 国产精品久久久久免费a∨| 欧美日韩免费观看一区=区三区| 欧美激情一二三区| 欧美精品日本| 欧美片在线观看| 欧美日本三级| 国产精品www网站| 国产精品护士白丝一区av| 欧美视频日韩视频在线观看| 欧美日韩在线观看一区二区三区| 欧美人体xx| 国产精品久久久久久妇女6080| 国产精品va在线| 国产精品一区二区在线观看不卡 | 国产精品影片在线观看| 国产欧美在线| 狠狠色狠狠色综合日日91app| 影音先锋另类| 亚洲精品国产精品国产自| 夜夜爽www精品| 亚洲欧美另类久久久精品2019| 欧美一区二区三区播放老司机| 欧美在线观看视频一区二区三区| 久久精品国产综合| 免费试看一区| 亚洲精品国产日韩| 亚洲永久在线| 久久久人成影片一区二区三区| 欧美高清不卡| 国产精品免费观看视频| 国产综合久久| 一区二区91| 久久精品91| 亚洲第一福利视频| 中文国产一区| 久久这里只有精品视频首页| 欧美日韩国产成人在线观看| 国产婷婷成人久久av免费高清| 亚洲黄色影片| 欧美一区二区视频97| 欧美激情一区二区在线| 正在播放欧美视频| 久久综合九色| 国产精品视频精品| 亚洲人成在线播放网站岛国| 亚洲综合精品四区| 欧美激情在线播放| 性一交一乱一区二区洋洋av| 欧美精品激情在线观看| 国产在线麻豆精品观看| 亚洲天堂久久| 亚洲缚视频在线观看| 香蕉久久久久久久av网站| 欧美精品自拍| 亚洲国产99精品国自产| 欧美一区二区在线免费播放| 亚洲精品在线视频| 久久噜噜噜精品国产亚洲综合|