前言
在C语言开发中,经常需要用到断言做非法检查。但是如果ASSERT使用太多,影响系统性能,所以需要把通过宏,把ASSERT编译成debug版本,和release版本。
自定义宏
- 知识点
do{}while()在宏定义中的运用;
- 解决“;”问题
- 把多行语句合并成一个代码块整体。
- 代码示例
通过条件控制,将代码编译成debug版本和release两种版本。
/***************************
*use do{}while(0) for MACRO
***************************/
#define ASSERT(condition) \
do{ \
if(condition) \
NULL; \
else \
Assert(__FILE__, __LINE__); \
}while(0)
宏的实现
- 知识点
- fflush(stderr):刷新标准错误输出流
- fflush(stdout):刷新标准输出流
- 代码示例
void Assert(char * filename, unsigned int lineno)
{
fflush(stdout);
fprintf(stderr,"Assert failed: %s, line %u\n",filename, lineno);
fflush(stderr);
abort();
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
void Assert(char* filename, unsigned int lineno);
/***************************
*use do{}while(0) for MACRO
***************************/
#define ASSERT(condition) \
do{ \
if(condition) \
NULL; \
else \
Assert(__FILE__, __LINE__); \
}while(0)
void Assert(char * filename, unsigned int lineno)
{
fflush(stdout);
fprintf(stderr,"Assert failed: %s, line %u\n",filename, lineno);
fflush(stderr);
abort();
}
int main()
{
ASSERT(false);
return 0;
}