C C 中的assert 巨集 斷言機制

2021-06-22 18:11:11 字數 3221 閱讀 6286

assert()是乙個除錯程式時經常使用的巨集,在程式執行時它計算括號內的表示式,如果表示式為false (0), 程式將報告錯誤,並終止執行。如果表示式不為0,則繼續執行後面的語句。這個巨集通常原來判斷程式中是否出現了明顯非法的資料,如果出現了終止程式以免導致嚴重後果,同時也便於查詢錯誤。

原型定義:

#include

void assert( int expression_r_r_r );

assert的作用是現計算表示式 expression_r_r_r ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式執行。請看下面的程式清單badptr.c:

#include

#include

#include

int main( void )

[root@localhost error_process]# gcc badptr.c

[root@localhost error_process]# ./a.out

a.out: badptr.c:14: main: assertion `fp'' failed.

已放棄 使用assert的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。

在除錯結束後,可以通過在包含#include 的語句之前插入 #define ndebug 來禁用assert呼叫,示例**如下:

#include

#define ndebug

#include

用法總結與注意事項:

1)在函式開始處檢驗傳入引數的合法性

如:int resetbuffersize(int nnewsize)

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不能代替條件過濾

assert只有在debug版本中才有效,如果編譯為release版本則被忽略掉。(在c中,assert是巨集而不是函式),使用assert「斷言」容易在debug時輸出程式錯誤所在。

而assert()的功能類似,它是ansi c標準中規定的函式,它與assert的乙個重要區別是可以用在release版本中。

式開啟乙個檔案,如果不存在就建立乙個同名檔案

assert( fp ); 

//所以這裡不會出錯

fclose( fp );

fp = fopen( "noexitfile.txt", "r" );//以唯讀的方式開啟乙個檔案,如果不存在就開啟失敗

assert( fp ); 

//所以這裡出錯

fclose( fp ); 

//程式永遠都執行不到這裡來

return 0;

}

[root@localhost error_process]# gcc badptr.c

[root@localhost error_process]# ./a.out

a.out: badptr.c:14: main: assertion `fp'' failed.

已放棄

使用assert的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。

在除錯結束後,可以通過在包含#include 的語句之前插入 #define ndebug 來禁用assert呼叫,示例**如下:

#include

#define ndebug

#include

用法總結與注意事項:

1)在函式開始處檢驗傳入引數的合法性

如:

int resetbuffersize(int nnewsize)

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不能代替條件過濾

assert只有在debug版本中才有效,如果編譯為release版本則被忽略掉。(在c中,assert是巨集而不是函式),使用assert「斷言」容易在debug時輸出程式錯誤所在。

而assert()的功能類似,它是ansi c標準中規定的函式,它與assert的乙個重要區別是可以用在release版本中。

Assert斷言機制

assert.istrue方法 assert.istrue jsondata.isarray assert.istrue jsondata.isarray,its not a array assert 斷言機制 測試 或者除錯程式時,總會做出一些假設,斷言就是用於在 中捕捉這些假設。當要判斷乙個方法...

assert 斷言函式 巨集

編寫 時,我們總是會做出一些假設,斷言就是用於在 中捕捉這些假設,可以將斷言看作是異常處理的一種高階形式。斷言表示為一些布林表示式,程式設計師相信在程式中的某個特定點該表示式值為真。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。同樣,程式投入執行後,終端使用者在遇到...

關於斷言機制 Assert 常用的方法

1 istrue boolean expression istrue boolean expression,string message 當 expression 不為 true 丟擲異常 2 notnull object object 當 object 不為 null 時丟擲異常,notnull ...