標籤:
可以將斷言看作是異常處理的一種進階形式。斷言驗證可以在任何時候啟用和禁用,因此可以在測試時啟用斷言,而在部署時禁用斷言。可以在預計正常情況下程式不會到達的地方放置斷言。使用斷言測試方法執行的前置條件和後置條件 。使用斷言檢查類的不變狀態,確保任何情況下,某個變數的狀態必須滿足。放在函數參數的入口處檢查傳入參數的合法性。Assert 陳述式不是永遠會執行,可以屏蔽也可以啟用,這就要求assert不管是在屏蔽還是啟用的情況下都不能對我們本身代碼的功能有所影響,每個assert應該只檢驗一個條件。使用assert的缺點是,頻繁的調用會極大的影響程式的效能,增加額外的開銷。所以在調試結束後,可以通過在包含#include 的語句之前插入 #define NDEBUG 來禁用assert調用。
原型定義:void assert( int expression );assert宏的原型定義在<assert.h>中,其作用是先計算運算式 expression ,如果expression的值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過調用abort 來終止程式運行。
1 /*******使用C內建斷言*******/ 2 #include <stdio.h>
//#define NDEBUG //開啟斷言
3 #include <assert.h>
4 int main( void ) 5 { 6 int i; 7 i=1; 8 assert(i++); 9 10 printf("%d\n",i);11 return 0;12 }
運行結果
除了用C提供的斷言,也可以使用自訂的斷言
1 /********使用自訂的斷言***********/ 2 #include <stdio.h> 3 #include <stdlib.h> 4 //#undef _EXAM_ASSERT_TEST_ //禁用 5 #define _EXAM_ASSERT_TEST_ //啟用 6 #ifdef _EXAM_ASSERT_TEST_ //啟用斷言測試 7 void assert_report( const char * file_name, const char * function_name, unsigned int line_no ) 8 { 9 printf( "\n[EXAM]Error Report file_name: %s, function_name: %s, line %u\n", file_name, function_name, line_no );10 abort();11 }12 #define ASSERT_REPORT( condition ) 13 do{ 14 if ( condition ) 15 NULL; 16 else 17 assert_report( __FILE__, __func__, __LINE__ ); 18 }while(0)19 #else // 禁用斷言測試 20 #define ASSERT_REPORT( condition ) NULL 21 #endif /* end of ASSERT */22 23 int main( void )24 {25 int i;26 i=0;27 // assert(i++);28 ASSERT_REPORT(i);29 printf("%d\n",i);30 return 0;31 }
C小技巧之斷言