C断言-封装assert

C语言代码经常要进行出错处理。调用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 );
		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 */

do{}while(0);语句可以有效的防止ASSERT_REPORT宏对于调用着本身的逻辑结构产生影响。如下面的代码

#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 )       \
	if ( condition )       \
	NULL;        \
	else         \
	assert_report( __FILE__, __func__, __LINE__ );
#else // 禁用断言测试 
	#define ASSERT_REPORT( condition )  NULL 
#endif /* end of ASSERT */


#define printf_define()\
	printf("one line!\n");\
	printf("two line!\n");


int main(int argc, char *argv[])
{
	int i = 0;
	
	if(1 == i)
		printf_define();
		
		|
		拆开宏带入
		|
		
	if(1 == i)
		printf("one line!\n");
	printf("two line!\n");
	
	
}

看出了什么问题吗?ASSERT_REPORT的带入,本身的逻辑结构就呗破坏了。只能执行到printf("two line!\n");
,di{}while(0);可以保证一段代码被完整的执行到。

 

参考大佬们的经验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值