在以上代码的开头部分我们把#define NDEBUG给注释掉了,所以我们启用了assert,main函数中使用了assert(copy_string(str,dec_str));来实现copy_string函数的调用,在copy_string函数中我们使用了一句return 1,所以最终的函数调用结果就等价于是assert(1),所以接下来继续执行assert下面的打印语句,最终成功的打印了三条输出语句,如果我们把开头的注释部分打开,结果就只能成功的输出起始部分一条打印语句。
以上我们都是在围绕着assert宏在讲解,仅仅是教会大家如何来使用assert宏,那么接下来看看我们如何来实现自己的断言呢?
接下来我们看看另外一段代码:
#include <stdio.h>
//#undef _EXAM_ASSERT_TEST_ //禁用 #define _EXAM_ASSERT_TEST_ //启用 #ifdef _EXAM_ASSERT_TEST_ //启用断言测试 void assert_report( const char * file_name, const char * function_name, unsigned int line_no ) { printf( "\n[EXAM]Error Report file_name: %s, function_name: %s, line %u\n", file_name, function_name, line_no );
} #define ASSERT_REPORT( condition ) \ do{ \ if ( condition ) \ NULL; \ else \ assert_report( __FILE__, __func__, __LINE__ ); \ }while(0) #else // 禁用断言测试 #define ASSERT_REPORT( condition ) NULL #endif /* end of ASSERT */ int main( void ) { int i; i=0; // assert(i++); ASSERT_REPORT(i); printf("%d\n",i); return 0; } |
运行结果如下:
[EXAM]Error Report file_name: assert3.c, function_name: main, line 29
0
细心的读者会发现我们并没有使用断言来结束当前程序的执行,所以在断言下面的printf成功的打印出了i的当前值,当然我们也可以做适当的修改,在断言出发现错误,那么就调用 abort();来使当前正在执行的程序异常终止,修改如下:
#include <stdio.h> #include <stdlib.h>
//#undef _EXAM_ASSERT_TEST_ //禁用 #define _EXAM_ASSERT_TEST_ //启用 #ifdef _EXAM_ASSERT_TEST_ //启用断言测试 void assert_report( const char * file_name, const char * function_name, unsigned int line_no ) { printf( "\n[EXAM]Error Report file_name: %s, function_name: %s, line %u\n", file_name, function_name, line_no ); abort(); }
#define ASSERT_REPORT( condition ) \ do{ \ if ( condition ) \ NULL; \ else \ assert_report( __FILE__, __func__, __LINE__ ); \ }while(0)
#else // 禁用断言测试 #define ASSERT_REPORT( condition ) NULL #endif /* end of ASSERT */ int main( void ) { int i; i=0; // assert(i++); ASSERT_REPORT(i); printf("%d\n",i); return 0;
} |