,,浅析C语言中assert的用法

,,浅析C语言中assert的用法

下面介绍一下assert在C语言中的使用。有需要的朋友可以参考一下。

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

#include assert.h

void assert( int表达式);

Assert用于计算表达式。如果它的值为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的缺点是频繁调用会极大影响程序性能,增加额外成本。

调试后,可以通过在包含# includeassert.h的语句前插入#define NDEBUG来禁用assert调用。示例代码如下:

#包含stdio.h

#定义NDEBUG

#include assert.h

宏名:断言

能量:测试一个条件并可能终止程序。

方法:void assert(int test);

程序例:

#include assert.h

#包含stdio.h

#包含stdlib.h

结构项目{

int键;

int值;

};

/*向列表中添加项目,确保列表不为空*/

void additem(struct ITEM * ITEM ptr){

assert(itemptr!=NULL);

/*将项目添加到列表*/

}

int main(void)

{

additem(空);

返回0;

}

assert() 宏用法

注意:assert是宏,而不是函数。在C的assert.h头文件中。

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

#include assert.h

void assert( int表达式);

assert的作用是先计算表达式。如果它的值为false(即0),它首先将错误消息打印到标准错误流stderr,然后调用abort来终止程序。否则,assert()不起作用。宏assert()一般用于确认程序的正常运行,其中只有当表达式构造无误时才为真值。调试完成后,没有必要从源代码中删除assert()语句,因为在定义宏NDEBUG时,宏assert()的定义是空的。

用法总结与注意事项:

1)在函数开始时检查传入参数的合法性。

比如:

int resetBufferSize(int nNewSize)

{

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

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

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

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

assert(nNewSize=0);

assert(nNewSize=MAX _ BUFFER _ SIZE);

.

}

2)每个断言只检查一个条件,因为同时检查多个条件时,如果断言失败,就无法直观判断哪个条件失败。

bad:assert(n offset=0n offset size=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不能代替条件过滤。

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

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: