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);可以保證一段代碼被完整的執行到。

 

參考大佬們的經驗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章