斷言的應該是一種程式設計的常見技巧。我所應用的斷言有兩種,一種是動態斷言,即大家所熟知的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 來終止程式執...