,,C++ 中assert()函数用法总结

,,C++ 中assert()函数用法总结

本文主要介绍了C中assert()函数用法总结的相关资料,有需要的朋友可以参考一下。

C++ 中assert()函数用法总结

assert宏的原型是在assert.h中定义的,它的作用是在条件返回错误时终止程序执行。原型定义:

#include assert.h

void assert( int表达式);

Assert用于计算表达式expression。如果它的值为false(即0),它将首先向stderr打印一条错误消息,然后通过调用abort终止程序。

请参阅下列程序清单badptr.c:

#包含stdio.h

#include assert.h

#包含stdlib.h

int main( void)

{

FILE * fp

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

断言(FP);//所以这里不会出错

fclose(FP);

fp=fopen( 'noexitfile.txt ',' r ');//以只读方式打开文件。如果它不存在,打开文件会失败。

断言(FP);//所以这里有一个错误

fclose(FP);//程序永远不会在这里执行

返回0;

}

[root @ localhost error _ process]# gcc bad ptr . c

[root@localhost错误处理]#。/a.out

a.out: badptr.c:14: main:断言“fp”失败。

使用assert()的缺点是频繁调用会极大影响程序性能,增加额外开销。调试后,可以通过在包含#include assert.h的语句前插入#define NDEBUG来禁用assert调用,

示例代码如下:

#包含stdio.h

#定义NDEBUG

#include assert.h

用法总结与注意事项:

1)检查函数开始时传入参数的合法性,例如:

int resetBufferSize(int nNewSize)

{

//函数:改变缓冲区大小,

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

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

//注意:保持原有信息内容不变。nNewSize=0表示清除缓冲区。

assert(nNewSize=0);

assert(nNewSize=MAX _ BUFFER _ SIZE);

.

}

2)每个断言只测试一个条件,因为同时测试多个条件时,如果断言失败,就无法直观判断哪个条件失败了,比如:

不好:

assert(n offset=0n offset nSize=m _ ninformationsize);

好的:

断言(n offset=0);

assert(no offset nSize=m _ ninformationsize);

3)不能使用改变环境的语句,因为assert只在DEBUG中生效。如果这样做,在程序实际运行时会遇到问题,例如:

错误:

断言(I 100);

这是因为如果出现错误,比如执行前i=100,那么这条语句就不会执行,然后I命令也不会执行。

正确:

断言(I 100);

我;

4)为了逻辑和视觉上的一致性,assert和下面的语句应该是空白的。

5)在某些地方,assert不能代替条件过滤。

以下是使用断言的几个原则:  

(1)使用断言来捕捉不应该发生的非法情况。不要混淆违法情况和错误情况的区别,后者是不可避免的,必须处理。

(2)通过使用断言来确认函数的参数。

(3)写函数的时候,要反复考察,问自己“我打算做什么假设?”的假设一旦确定,就要用断言来检验假设。

(4)一般教科书鼓励程序员设计防错程序,但要记住这种编程风格会掩盖错误。在进行防错编程时,如果确实发生了“不可能”的事情,应该使用断言来报警。

ASSERT()是调试程序时经常使用的宏。当程序运行时,它计算括号中的表达式。如果表达式为FALSE (0),程序将报告错误并终止执行。如果表达式不为0,继续执行下面的语句。这个宏通常决定程序中是否有明显的非法数据。如果有终止程序,会避免严重后果,也容易发现错误。

ASSERT仅在调试版本中有效,如果编译成发布版本,则被忽略。

比较好的在程序中使用assert的地方:

(1)空指针检查。例如,检查函数参数的空指针。可以用这个:assert(指针!=NULL);产生的错误将是这样的:Assertion 'pointer!=((void *)0)'失败.这样,当有一个空指针时,你的程序会退出并给出一个好的错误信息。

(2)检查功能参数的值。比如,如果一个函数只有当它的一个参数foo为正时才能被调用,那么可以在函数的开头写这个:assert(foo 0);这将有助于您检测到函数的误用,同时也会给源代码的读者一个清晰的印象,即这里对函数的参数值有限制。

感谢您的阅读,希望能帮到您,也感谢您对本站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: