C語言中的斷言

2021-08-30 22:05:26 字數 1336 閱讀 1902

假設要求程式輸入兩個數先後為x和y,要求 x >= y,否則即認為程式錯誤。**如下。

// assert.c

#include #include int main()

return 0;

}

執行結果如下圖

由此可見,如果 assert()中止了程式, 它會顯示失敗的測試、 包含測試的檔名和行號

assert()巨集接受乙個整型表示式作為引數。如果表示式求值為假,assert()巨集就在標準錯誤流(stderr) 中寫入一條錯誤資訊, 並呼叫abort()函式終止程式。因此如下也能完成上述功能(abort()函式的原型在stdlib.h標頭檔案中):

if (z < 0)

assert()巨集定義在assert.h 標頭檔案中,它是乙個用於輔助除錯程式的小型庫。

另外乙個重要特點就是無需更改**就能開啟或關閉 assert()的機制。 如果認為已經排除了程式的 bug, 就可以把下面的巨集定義寫在包含assert.h的位置前面:

#define ndebug
並重新編譯程式, 這樣編譯器就會禁用檔案中的所有 assert()語句。 如

果程式又出現問題, 可以注釋掉這條#define指令, 然後重新編譯程式, 這樣就重新啟用了assert()語句。

assert()表示式是在執行時進行檢查。 c11新增的_static_assert宣告可以在編譯時檢查assert()表示式。 因此, assert()可以導致正在執行的程式中止, 而_static_assert()可以導致程式無法通過編譯。

_static_assert()接受兩個引數。 第1個引數是整型常量表示式, 第2個引數是乙個字串。 如果第 1 個表示式求值為 0,編譯器會顯示字串, 而且不編譯該程式。 如下,編譯報錯。

桃花仙人種桃樹,又摘桃花換酒錢_

C語言中斷言ASSERT

我一直以為assert僅僅是個報錯函式,事實上,它居然是個巨集,並且作用並非 報錯 在經過對其進行一定了解之後,對其作用及用法有了一定的了解,assert 的用法像是一種 契約式程式設計 在我的理解中,其表達的意思就是,程式在我的假設條件下,能夠正常良好的運作,其實就相當於乙個if語句 if 假設成...

C語言中,斷言的使用

標準c中的斷言函式assert 如果斷言函式的引數為0時將觸發斷言函式的執行,會在執行時程式崩潰。我從freertos中學到,freertos中的斷言函式configassert 和標準c中的斷言函式assert 是一樣的,我們可以重新利用他,下面我用乙個簡單的程式例項,來學習下。include i...

C語言斷言

斷言是對某種假設條件進行檢查 可理解為若條件成立則無動作,否則應報告 它可以快速發現並定位軟體問題,同時對系統錯誤進行自動報警。斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,從而縮短軟體問題定位時間,提高系統的可測性。實際應用時,可根據具體情況靈活地設計斷言。原型定義 include...