C语言的那些小秘密之断言

发表于:2011-10-09 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

分享:

  在以上代码的开头部分我们把#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;

}

53/5<12345>
重磅发布,2022软件测试行业现状调查报告~

精彩评论

  • sehnsucht1986
    2013-8-30 10:08:53

    在第二段示例代码中,原文说“如果我们把开头的注释部分打开,结果就只能成功的输出起始部分一条打印语句”,事实上,还是打印出了3条语句。

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号