assert巨集的用法及原理

2021-09-30 07:24:16 字數 2147 閱讀 8817

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

#include

void assert( int expression );

assert的作用是現計算表示式 expression ,如果其值為假(即為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呼叫(因為release版本中定義了ndebug這個巨集常量,而在release版本中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不能代替條件過濾

在c中 , 相信assert這個斷言是用的最頻繁的巨集之一,特別是在我們找bug的時候,多用一些斷言可以讓我們更靠近出錯的**,不多說,進入我們的主題,寫出乙個assert巨集來。

首先我們都知道,assert在debug版下是有效的,在release版中assert是無效的,那麼我們應該如何實現這一功能呢?實際上在release的版本中系統定義了ndbug這個巨集常量,當然在debug中沒有定義這個巨集常量,所以在定義這個巨集之前檢查是否定義過ndbug這個巨集就可以知道是debug版還是release版了,見下面的**:

1

#if!defined(ndbug)

2#define

assert(p) /*這裡寫上巨集的***/

3#else

4#define

assert(p)

5#endif

現在我們繼續實現的assert , 我們都知道斷言要是失敗了,要輸出失敗位置所在檔案的檔名和行號 , 當然輸出應該重定向到標準出錯裡面。

__file__記錄了當前執行的檔名。

__line__記錄當前執行的行號。

stderr是標準出錯。

當然斷言要是失敗的話 , 呼叫abort終止程式的執行 , **實現如下。

1

#if!defined(ndbug)

2#define

assert(p) if(!(p))

5#else

6#define

assert(p)

7#endif

assert 巨集用法

assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 include assert.h void assert intexpression assert的作用是現計算表示式 expression 如果其值為假 即為0 那麼它先向stderr列印一條出錯資訊,然後通過...

C語言 assert巨集的用法

assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 include void assert int expression assert的作用是現計算表示式 expression 如果其值為假 即為0 那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort...

C語言的assert巨集的用法

assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 include void assert int expression assert的作用是現計算表示式 expression 如果其值為假 即為0 那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort...