断言 assert

来源:互联网 发布:游戏破解软件大全 编辑:程序博客网 时间:2024/06/06 18:12

编写代码时,我们总是会做出一些假设可以将断言看作异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。
C里用法
使用断言可以创建更稳定,品质更好且不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。
使用断言使我们向按契约式设计更近了一步。
C里的宏
宏名: assert
功 能: 测试一个条件并可能使程序终止
用 法: void assert(int test);
程序例:

#include<assert.h>#include<stdio.h>#include<stdlib.h>struct ITEM{    int key;    int value;};/*add item to list,make sure list is not null*/void additem(struct ITEM* itemptr){    assert(itemptr!=NULL);    /*additemtolist*/}int main(void){    additem(NULL);    return 0;}

assert() 宏用法
注意:assert是宏,而不是函数。在C的assert.h头文件中。
assert宏的原型定义在

#defineassert(expr)\((expr)\?__ASSERT_VOID_CAST(0)\:__assert_fail(__STRING(expr),__FILE__,__LINE__,__ASSERT_FUNCTION))/*DefinedInGlibc2.15*/

assert的作用是先计算表达式expr,如果其值为假(即为0),那么它会打印出来assert的内容和__FILE__, __LINE__, __ASSERT_FUNCTION,然后执行abort()函数使kernel杀掉自己并coredump(是否生成coredump文件,取决于系统配置);否则,assert()无任何作用。宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值。完成调试后,不必从源代码中删除assert()语句,因为宏NDEBUG有定义时,宏assert()的定义为空。.

请看下面的程序清单badptr.c:

#include<stdio.h>#include<assert.h>#include<stdlib.h>int main(void){    FILE* fp;    fp=fopen("test.txt","w");//以可写的方式打开一个文件,如果不存在就创建一个同名文件    assert(fp);//所以这里不会出错    fclose(fp);    fp=fopen("noexitfile.txt","r");//以只读的方式打开一个文件,如果不存在就打开文件失败    assert(fp);//所以这里出错     fclose(fp);//程序永远都执行不到这里来    return 0;}

运行效果图:
这里写图片描述

0 0
原创粉丝点击