一、assert函数的目的:
断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位,并且输出信息很详细,可以很好地解决大多数C语言编译器错误信息输出不详细的问题
二、assert宏的原型,assert在哪里定义的
C语言中,assert断言的原型定义在<assert.h>文件中。assert是一个宏定义,并不是一个函数。其作用是先计算表达式 expression ,如果expression的值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。
断言的消息会显示库依赖,但是它也包含一下信息,源文件的名字,处于哪一行,在哪儿发生的,一般的格式如下:
Assertion failed: expression, file filename, line line number
三、assert使用范围
1、放在函数入口,对入口参数进行合法性检查(如strcpy函数中用assert函数检查入口参数是否为NULL)
2、将assert(0)放在预计正常 下不会出现的地方(一旦出现肯定是异常出错了)
3、放在前置条件必须满足、后置条件必须满足、不变条件必须满足的场合
四、assert使用原则
1、一个断言只能检测一个条件。
2、断言检查只是辅助条件,不能替代条件检测。
3、不能使用改变环境语句的使用。
4、频繁使用断言也会降低效率。并且它的强制停止所以不适合嵌入式程序和服务器,但也可以改写只报错误而不停止,即不调用abort()。
5、不要浪费别人的时间—详细说明不清楚的断言;消除所做的隐式假定,或者利用断言检查其正确性例如:有时候我们会不自觉的认为一个字节占8位,或者说一个long型占据4个字节,这些都是对编译程序或操作系统做的一些假定。这使得我们需要在程序中使用断言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。
6、断言是进行调试检查的简单方法。要使用断言来检查绝对不应该发生的非法情况,不要混淆非法情况和错误情况,错误情况是需要在最终产品中处理的。
7、利用断言对函数的参数进行确认,并且当程序员使用了无定义特性时向程序员报警。
8、当编写函数时,应反复问自己做了哪些假定,一旦确定了相应的假定,就要使用断言对所做的假定进行检验,或者重新编写代码去除假定。
五、assert使用举例
1、
/* assert example */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */
void print_number(int* myInt) {
assert(myInt != NULL);
printf("%d\n", *myInt);
}
int main()
{
int a = 10;
int * b = NULL;
int * c = NULL;
b = &a;
print_number(b);
print_number(c);
system("pause");
return 0;
}
执行结果如下:
2、用asset检查入口参数
void *MemCopy(void *dest, const void *src, size_t len)
{
assert(dest != NULL && src !=NULL);
char *tmp_dest = (char *)dest;
char *tmp_src = (char *)src;
while(len --)
*tmp_dest ++ = *tmp_src ++;
return dest;
}
体验这个函数中asset的作用
六、用户定义自己的宏assert
以后在更新吧,这里还没有看到/写出很好的代码