c語言之assert的使用,c語言assert
assert
作用
程式中關鍵的地方可以通過assert這個宏來斷言。如果斷言非真,程式停止,標準錯誤輸出一條具體的錯誤資訊。
但在實戰中,程式直接停止是很不好的現象,因此斷言只在偵錯工具使用。
NDEBUG宏
為了在調試中方便使用assert,而在不需要時容易停掉assert的工作,於是有了NDEBUG宏來規定assert的行為。如果定義了這個宏,assert不會起作用。
#ifdef NDEBUG
#define assert(x) ((void)0)
#else
...
標頭檔的特性
assert.h標頭檔和別的標頭檔不同,不具有等冪性。
等冪性就是包含該檔案一次到多次,效果相同。
但assert.h檔案包含多次,卻不一定相同。
一開始就取消了原有的 assert宏的定義
因此開啟斷言要寫成 #undef NDEBUG#include<assert.h>
關閉斷言要寫成#define NDEBUG#include<assert.h>
測試
#include <stdio.h>#include <stdlib.h>#define NDEBUG#include <assert.h>void t1(void){ int i = 0; assert(i == 0); assert(i == 1);}#undef NDEBUG#include <assert.h>void t2(void){ int j = 0; assert(j == 0); assert(j == 1);}#define NDEBUG#include <assert.h>int main(void){ int i = 1; assert(i == 0); t1(); printf("hello world\n"); t2();}
t1函數開始時,取消了斷言,因此執行t1不會停止。t2函數開始時,實行了斷言,因此最後t2會停止在 j==1句時。main函數雖然斷言為假,但開始時取消了斷言,因此不會停止。
輸出結果為:
C語言 assert幹什用的
調用assert.h 裡面的assert宏
用途錯誤偵測
assert( maxval(5, ten, sqr) == 50); 《《 maxval(5, ten, sqr) 傳回值不等於50
輸出錯誤並退出程式。。。。。。。。。。。。。。。。。。
#include <assert.h> void assert( int exp );
功能:宏assert()用於錯誤偵測。如果運算式的結果為零,宏寫錯誤資訊到STDERR並退出程式執行。如果宏NDEBUG已經定義,宏assert()將被忽略。
ASSERT在C語言中有什作用?
是程式調試很重要的手段,
ASSERT( f )
在Debug模式下,每次運行到這裡後會計算括弧中的運算式,如果運算式為0,則中斷執行,彈出一個警告框,使用者可選擇“繼續”,“重試”,“忽略”
在Release模式下,這句語句不會被編譯進代碼。
ASSERT一般用於程式內部確認參數的正確性,即調用內建函式的時候,要由調用者保證參數的正確,而被調用函數內部,就可以通過ASSERT來檢查參數是否滿足要求。