可以将断言看作是异常处理的一种高级形式。断言验证可以在任何时候启用和禁用,因此可以在测试时启用断言,而在部署时禁用断言。可以在预计正常情况下程序不会到达的地方放置断言。使用断言测试方法执行的前置条件和后置条件 。使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。放在函数参数的入口处检查传入参数的合法性。断言语句不是永远会执行,可以屏蔽也可以启用,这就要求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 }
时间: 2024-10-22 13:58:27