断言
断言是什么?简单而言,断言是对某种假设条件进行检查。
C语言中,在assert.h中,断言被定义为宏的形式(assert(expression)
),而不是函数。
assert将通过检查表达式的值来决定是否需要终止程序,如果表达式为真(1)则忽略断言,程序继续运行。如果表达式为假(0),那么首先向错误流strerr打印一条错误信息,然后通过abort函数终止程序的运行。
断言用法的简单例子:
int a,b;
a = 1;
b = 1 ;
assert(b!=0);
printf("a/b = %d\n",a/b);
通过查看assert.h,NDEBUG宏打开状态时assert宏是可用的。
默认情况下,assert宏只有在Debug版本才起作用,而在Release版本中将被忽略。但在许多操作系统的C程序中,Release版本中也将NDEBUG宏依然为打开状态。
也便是说如果需要用到断言时,用户可以通过重定义自己的ASSERT。例子如下:
#ifdef DEBUG
#define ASSERT(condition) \
do{ \
if(condition) \
{ \
NULL; \
} \
else{ \
assert(condition); \
} \
}while(0)
#else
#define ASSERT(condition) NULL
#endif
避免使用断言去检查程序错误
在断言的使用中,应该遵循这样的一个规定:对来自系统内部的可靠数据使用断言,对于外部不可靠数据不能使用断言,而应该使用错误处理代码。
换句话而言,断言是用来处理不应该发生的非法情况,而对于可能发生的应该使用错误处理代码。
对于用户输入,与外