C 技巧之斷言Assert

2021-07-04 07:55:01 字數 1931 閱讀 9155

斷言的應該是一種程式設計的常見技巧。我所應用的斷言有兩種,一種是動態斷言,即大家所熟知的c標準庫的assert()巨集,一種是c 中的靜態斷言,即在編譯期間檢查。

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

view plaincopy to clipboardprint?

#include

void assert( int expression ); 

#include

void assert( int expression );

assert的作用是先計算表示式 expression ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式執行。

大家要注意是,其中的表示式為假時,會終止程式執行,包括我在內經常會寫錯**,斷言乙個指標是否為空,往往寫成了

assert(!p);其實應該寫成assert(p);

assert是執行期的判斷,並且會強制終止程式,一般要求只能用於debug版本中,是為了盡可能快的發現問題。尤其在我所從事的電信軟體產品中,assert是要從release版本中(自動忽略)去掉。所以一般開發會重新定義assert巨集。

2)靜態斷言,在新的c 標準中c 0x中,加了對靜態斷言的支援,引入了新的關鍵字static_assert來表示靜態斷言。使用靜態斷言,我們可以在程式的編譯時期檢測一些條件是否成立。但這個關鍵字太新了,沒有幾個編譯器是支援的(好像vc2008支援,我用vc很少,主要是在linux下c 程式設計)。於是可以使用c 現有的模板特性來實現靜態斷言的功能。boost中也已有boost_static_assert巨集的實現,有興趣的同學可以down下來仔細研究一下,它的斷言資訊更豐富,下面為我的簡單實現:

view plaincopy to clipboardprint?

// declare a tempalte class staticassert. 

template struct staticassert; 

// only partial specializate parameter's value is true. 

template <> struct staticassert

; }; 

#define static_assert(expression) (void)staticassert::value 

// declare a tempalte class staticassert.

template struct staticassert;

// only partial specializate parameter's value is true.

template <> struct staticassert;};

#define static_assert(expression) (void)staticassert::value

原理是,先宣告乙個模板類,但後面僅僅偏特化引數值為true的類,而為false的類則乙個未定義的類,即是乙個未完整的型別,編譯期間無法找到staticassert::value型別。舉例如下:

view plaincopy to clipboardprint?

static_assert(4 == sizeof(long) ); //在 32bit機上ok 

static_assert(4 == sizeof(long) ); //在 64bit機上ng,long為8位元組 

static_assert(4 == sizeof(long) ); //在 32bit機上ok

static_assert(4 == sizeof(long) ); //在 64bit機上ng,long為8位元組

靜態斷言在編譯時進行處理,不會產生任何執行時刻空間和時間上的開銷,這就使得它比assert巨集具有更好的效率。另外比較重要的乙個特性是如果斷言失敗,它會產生有意義且充分的診斷資訊,幫助程式設計師快速解決問題。

C 技巧之斷言Assert

斷言的應該是一種程式設計的常見技巧。我所應用的斷言有兩種,一種是動態斷言,即大家所熟知的c標準庫的assert 巨集,一種是c 中的靜態斷言,即在編譯期間檢查。1 動態斷言 assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 include void assert...

C 基礎 ASSERT斷言

assert是個巨集,並且作用並非 報錯 assert 的用法像是一種 契約式程式設計 在我的理解中,其表達的意思就是,程式在我的假設條件下,能夠正常良好的運作,其實就相當於乙個if語句 if 假設成立 else 但是這樣寫的話,就會有無數個if語句,甚至會出現,乙個if語句的括號從檔案頭到檔案尾,...

C語言斷言assert詳解

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