请输入您要查询的百科知识:

 

词条 assert
释义

§ 函数名

assert

§ 功能

测试一个条件并可能使程序终止

§ 函数语法

函数名:assert

功能:测试一个条件并可能使程序终止

用法:voidassert(inttest);

程序例:

#include

#include

#include

structITEM{

intkey;

intvalue;

};

/*additemtolist,makesurelistisnotnull*/

voidadditem(structITEM*itemptr){

assert(itemptr!=NULL);

/*additemtolist*/

}

intmain(void)

{

additem(NULL);

return0;

}

assert(断言)可以有两种形式:

assertExpression1;

assertExpression1:Expression2;

Expression1应该总是产生一个布尔值。

Expression2可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的String消息。

断言在默认情况下是禁用的。要在编译时启用断言,需要使用source1.4标记:

javac-source1.4Test.java

要在运行时启用断言,可使用-enableassertions或者-ea标记。

要在运行时选择禁用断言,可使用-da或者-disableassertions标记。

要系统类中启用断言,可使用-esa或者-dsa标记。还可以在包的基础上启用或者禁用断言。

可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

assert()函数用法

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include

voidassert(intexpression);

assert的作用是现计算表达式expression,如果其值为假(即为0),那么它先向stderr打印一条出错信息,

然后通过调用abort来终止程序运行。

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

#include

#include

#include

intmain(void)

{

FILE*fp;

fp=fopen("test.txt","w");//以可写的方式打开一个文件,如果不存在就创建一个同名文件

assert(fp);//所以这里不会出错

fclose(fp);

fp=fopen("noexitfile.txt","r");//以只读的方式打开一个文件,如果不存在就打开文件失败

assert(fp);//所以这里出错

fclose(fp);//程序永远都执行不到这里来

return0;

}

[root@localhosterror_process]#gccbadptr.c

[root@localhosterror_process]#./a.out

a.out:badptr.c:14:main:Assertion`fp'failed.

已放弃

使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含#include的语句之前插入#defineNDEBUG来禁用assert调用,示例代码如下:

#include

#defineNDEBUG

#include

用法总结与注意事项:

1)在函数开始处检验传入参数的合法性

如:

intresetBufferSize(intnNewSize)

{

//功能:改变缓冲区大小,

//参数:nNewSize缓冲区新长度

//返回值:缓冲区当前长度

//说明:保持原信息内容不变nNewSize=0);

assert(nNewSize=0&&nOffset nSize=0);

assert(nOffset nSize<=m_nInfomationSize);

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

错误:assert(i <100)

这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i 这条命令就没有执行。

正确:assert(i<100)

i ;

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

5)有的地方,assert不能代替条件过滤

---------------------------------------------------------

在switch语句中总是要有default子句来显示信息(Assert)。

intnumber=SomeMethod();

switch(number)

{

case1:

Trace.WriteLine("Case1:");

break;

case2:

Trace.WriteLine("Case2:");

break;

default:

Debug.Assert(false);

break;

}

§ 用法实例

#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);

/* add item to list */

}

int main(void)

{

additem(NULL);

return 0;

}

随便看

 

百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/11/11 12:27:04