c++ assert()函式原型及介紹如下:
c++0x中引入了static_assert這個關鍵字,用來做編譯期間的斷言,因此叫做靜態斷言。
其語法很簡單:static_assert(常量表示式,提示字串)。
如果第乙個引數常量表示式的值為真(true或者非零值),那麼static_assert不做任何事情,就像它不存在一樣,否則會產生一條編譯錯誤,錯誤位置就是該static_assert語句所在行,錯誤提示就是第二個引數提示字串。
說明 使用static_assert,我們可以在編譯期間發現更多的錯誤,用編譯器來強制保證一些契約,並幫助我們改善編譯資訊的可讀性,尤其是用於模板的時候。
static_assert可以用在全域性作用域中,命名空間中,類作用域中,函式作用域中,幾乎可以不受限制的使用。
編譯器在遇到乙個static_assert語句時,通常立刻將其第乙個引數作為常量表示式進行演算,但如果該常量表示式依賴於某些模板引數,則延遲到模板例項化時再進行演算,這就讓檢查模板引數成為了可能
例子:
1
2
#include < assert.h>
void
assert
(
int
expression );
功 能: 測試乙個條件並可能使程式終止.
c++ assert()函式的作用是現計算表示式 expression ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式
執行。使用c++ assert()函式的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。在除錯結束後,可以通過在包含#include < assert.h>的語句
之前插入 #define ndebug 來禁用assert呼叫,示例**如下:
1
2
3
#include < stdio.h>
#define ndebug
#include < assert.h>
用法總結與注意事項:
1)在函式開始處檢驗傳入引數的合法性. 如:
1
2
3
4
5
6
7
8
9
10
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 版本,debug 版本用於內部除錯,release 版本發行給使用者使用。這個概念可能不大好理解,想想vc下,除錯時有個選項,乙個是debug,乙個是release assert 表示式 的意思是 當表示式為真時,程式繼續執行,如果表達市為假,那程式就會...
斷言(ASSERT 的用法
我一直以為assert僅僅是個報錯函式,事實上,它居然是個巨集,並且作用並非 報錯 在經過對其進行一定了解之後,對其作用及用法有了一定的了解,assert 的用法像是一種 契約式程式設計 在我的理解中,其表達的意思就是,程式在我的假設條件下,能夠正常良好的運作,其實就相當於乙個if語句 if 假設成...
斷言(ASSERT 的用法
assert 的用法像是一種 契約式程式設計 在我的理解中,其表達的意思就是,程式在我的假設條件下,能夠正常良好的運作,其實就相當於乙個if語句 if 假設成立 else 但是這樣寫的話,就會有無數個if語句,甚至會出現,乙個if語句的括號從檔案頭到檔案尾,並且大多數情況下,我們要進行驗證的假設,只...