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

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

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

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

  运行结果如下:

  [EXAM]Error Report file_name: assert3.c, function_name: main, line 31

  Aborted

  此时就不会在执行接下来的打印语句了。看看我们自己的实现方式就知道,我们自己编写的断言可以比直接调用assert宏可以得到更多的信息量,主要是由于我们自己编写的断言更加的具有灵活性,可以根据自己的需要来打印输出不同的信息,同时也可以对于不同类型的错误或者警告信息使用不同的断言,这也是在工程代码中经常使用的做法。如果你在关注代码运行结果的同时也认真的阅读了我的代码,你会发现其中我在宏定义中使用了一个do{}while(0),使用它有什么好处呢,或许在以上的代码中并没有体现出来,那么我们看看下面的代码你就知道了。

#include <stdio.h>

void print_1(void)
{
 printf("print_1\n");
}
void print_2(void)
{
 printf("print_2\n");
}
#define  printf_value()    \
   print_1();   \
   print_2();   \

int main( void )
{
 int i=0;
 if(i==1)
 printf_value();

 return 0;
}

  运行结果:

  还是备份一下文章描述,以防图片打开失败给读者带来困扰。

  print_2

  Press any key to continue

  看了上面运行结果可能有的读者会很疑惑为什么会出现以上的错误呢?!if语句的条件不满足,那么print_value()函数应该不会被调用啊,怎么会打印呢。如果我们把上面的printf_value()替换为 print_1();  print_2();,就会很清楚的发现if语句在此的作用仅仅是不调用print_1();,而print_2();在控制之外,所以出现了上面的结果,有的读者可能会马上想到我们加上一个{}不就好了吗,在这里的确是加一个{}就可以了,因为这里是一个特殊情况,没有else语句,如果我们在以上的宏定义中使用{},加入else语句后再来看看代码。

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

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

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号