中的斷言的用法?
assert是包含在頭文件<cassert>中的宏定義,如下:
#ifdef NDEBUG# define assert(condition) ((void)0)#else# define assert(condition) /*implementation defined*/#endif
由此可見,當NDEBUG已經定義時,assert沒有任何作用。反之,condition為零時,assert會終止程序。
通常,debug(調試)模式下不會定義NDEBUG;而release(發布)模式下,會定義NDEBUG。由此可知,assert是用于調試的命令。
一般而言,在編寫程序時,我們會假設輸入、輸出滿足一定的條件。由于程序員的疏忽,我們不太可能一次就寫對程序。當出現錯誤時,我們所做的假設可能會不成立。如果我們能將所有假設都用assert進行判斷,那么程序出錯時,我們能在第一時間發現問題所在。另一方面,我們希望對假設條件的判斷不會影響程序的效率。因此,當我們確信程序沒有錯誤時,我們希望assert什么都不做。請看如下示例:
#include <cassert>template<typename T>T multiply(T const& a, T const& b) { return a * b;}template<typename T>T div(T const& a, T const& b) { return a / b;}int main() { double const a = 1, b = 2; assert(multiply(div(a, b), b) == a); return 0;}
其中定義了multiple(乘法),div(除法)操作。表面上,我們并沒有什么錯誤,不過為了保險起見,我們使用了assert進行驗證。結果正如我們希望的,沒有任何錯誤。然而,當我們將a, b的類型改為int時,程序出錯了(debug模式)。因為,div的定義其實是有問題的(相信樓主能看出來吧^^)。
總之,每當我們對程序有任何假設、期望,都應該將它轉化為assert語句寫入程序當中。它能幫助我們定位錯誤的位置,縮短調試時間,百利而無一害。
PS: 需要注意的是assert應該用于處理程序中的邏輯錯誤,而不是輸入錯誤。因此判斷文件打開是否出錯,應該使用異常等錯誤處理機制,而不是assert。