C语言中assert的用法

合集下载

C语言断言assert的用法

C语言断言assert的用法

assert的用法assert(<expression>);当expression结果为“假”时,会在stderr中输出这条语句所在的文件名和行号,以及这条表达式。

这只在调试版本中起作用,在Release版本中不会产生任何代码。

通常当我们使用assert时,都在强烈说明一个含义:在这里必然如此。

它通常用于一个函数的先验条件和后验条件的检查。

比如我写一个C风格复制字符串的函数,并且认为调用者不应该传入NULL指针:char * clone_string(const char * source){char * result;assert(source != NULL);result = (char *)malloc(strlen(source) + 1);if (result != NULL){strcpy(result, source);assert(strcmp(result, source) == 0);}return result;}注意到我对source是否为NULL是用assert检查的,但对result是不是为NULL是用if语句判断的,这是因为在调用代码正确的情况下source必然不为NULL,如果断言失败,说明调用代码中有错误,需要修改;但result作为malloc的返回值则不一定,在malloc代码无误的情况下仍然可能返回NULL——当内存块不足时。

最后又用assert对strcpy的结果进行检查,因为只要代码正确,无论什么情况strcpy应该正常完成复制,它没有malloc那种异常情况存在。

在《编程精粹》第二章(自己设计并使用断言)开始的一段话把assert的用途说的很清楚:利用编译程序自动查错固然好,但我敢说只要你观察一下项目中那些比较明显的错误,就会发现编译程序所查出的只是其中的一小部分。

我还敢说,如果排除掉了程序中的所有错误那么在大部分时间内程序都会正确工作。

C++Assert

C++Assert

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义如下:#include <assert.h>void assert( int expression );assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。

请看下面的程序清单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;}在命令行下运行该程序,结果如下:[root@localhost error_process]# gcc badptr.c[root@localhost error_process]# ./a.outa.out: badptr.c:14: main: Assertion `fp'' failed.已放弃使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含#include <assert.h>的语句之前插入#define NDEBUG 来禁用assert调用,示例代码如下:#include <stdio.h>#define NDEBUG#include <assert.h>assert的用法总结与注意事项:1、在函数开始处检验传入参数的合法性,如:int resetBufferSize(int nNewSize){ //函数功能:改变缓冲区大小,//函数参数:nNewSize 缓冲区新长度//函数返回值:缓冲区当前长度//说明:保持原信息内容不变//nNewSize<=0表示清除缓冲区assert(nNewSize >= 0);assert(nNewSize <= MAX_BUFFER_SIZE);}2、每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观地判断是哪个条件失败,比较下面两种形式的代码:不好:assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);好:assert(nOffset >= 0);assert(nOffset+nSize <= m_nInfomationSize);3、不能使用改变环境的语句,因为assert只在DEBUG时生效,这么做的话会使程序在真正运行时遇到问题错误,例如:assert(i++ < 100);如果在执行之前i=100,那么这条语句就不会执行,i++这条命令就没有执行。

断言assert函数,C语言assert函数完全攻略

断言assert函数,C语言assert函数完全攻略

断言assert函数,C语言assert函数完全攻略对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。

简单地讲,断言就是对某种假设条件进行检查。

在C 语言中,断言被定义为宏的形式(assert(expression)),而不是函数,其原型定义在<assert.h>文件中。

其中,assert 将通过检查表达式expression 的值来决定是否需要终止执行程序。

也就是说,如果表达式expression 的值为假(即为0),那么它将首先向标准错误流stderr 打印一条出错信息,然后再通过调用abort 函数终止程序运行;否则,assert 无任何作用。

默认情况下,assert 宏只有在Debug 版本(内部调试版本)中才能够起作用,而在Release 版本(发行版本)中将被忽略。

当然,也可以通过定义宏或设置编译器参数等形式来在任何时候启用或者禁用断言检查(不建议这么做)。

同样,在程序投入运行后,最终用户在遇到问题时也可以重新起用断言。

这样可以快速发现并定位软件问题,同时对系统错误进行自动报警。

对于在系统中隐藏很深,用其他手段极难发现的问题也可以通过断言进行定位,从而缩短软件问题定位时间,提高系统的可测性。

尽量利用断言来提高代码的可测试性在讨论如何使用断言之前,先来看下面一段示例代码:1.void*Memcpy(void*dest,const void*src, size_t len)2.{3.char*tmp_dest =(char*)dest;4.char*tmp_src =(char*)src;5.while(len --)6.*tmp_dest ++=*tmp_src ++;7.return dest;8.}对于上面的Memcpy 函数,毋庸置疑,它能够通过编译程序的检查成功编译。

从表面上看,该函数并不存在其他任何问题,并且代码也非常干净。

但遗憾的是,在调用该函数时,如果不小心为dest 与src 参数错误地传入了NULL 指针,那么问题就严重了。

C语言assert用法

C语言assert用法

C语言assert用法C语言assert用法assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,下面是店铺为大家搜索整理的C语言assert用法,希望大家能有所收获,assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );assert的.作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

请看下面的程序清单badptr.c:复制代码代码如下:#include#include#includeint main( void ){FILE *fp;fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件assert( fp ); //所以这里不会出错fclose( fp );fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败assert( fp ); //所以这里出错fclose( fp ); //程序永远都执行不到这里来return 0;}宏名: assert功能: 测试一个条件并可能使程序终止用法: void assert(int test);程序例:复制代码代码如下:#include#include#includestruct 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;}assert() 宏用法注意:assert是宏,而不是函数。

c语言中的断言

c语言中的断言

c语言中的断言断言(Assertion)是C语言中一种用于检查程序中假设的语句的正确性的方法。

通过使用断言,开发人员可以在程序中插入一些条件,以确保程序的执行满足特定的预期。

断言的作用是在程序运行时检查某个条件是否为真。

如果条件为真,则程序继续执行;如果条件为假,则断言将触发错误,并在运行时终止程序的执行。

断言通常用于检查程序中的约束条件、前提条件或不变条件是否满足,以避免潜在的错误。

在C语言中,断言通常使用assert宏来表示。

assert宏接受一个表达式作为参数,如果该表达式的值为0(假),则断言失败,程序终止执行,并将错误信息打印到标准错误流。

如果表达式的值为非零(真),则断言成功,程序继续执行。

断言的使用可以帮助开发人员在编写程序时进行自动化的测试和调试。

通过在关键位置插入断言,可以检查程序中的一些关键条件是否满足,以帮助开发人员找出潜在的错误和问题。

例如,可以使用断言来检查函数的输入参数是否有效,数组的索引是否越界,指针是否为空等。

断言的使用可以提高程序的健壮性和可靠性。

在开发过程中,使用断言可以帮助开发人员及时发现并修复程序中的错误。

在程序发布后,断言可以帮助用户发现并报告潜在的问题,以便开发人员进行修复。

通过使用断言,开发人员可以更早地发现和解决问题,从而提高程序的质量和可维护性。

然而,使用断言时需要注意一些问题。

首先,断言通常被认为是一种调试技术,不应该在生产环境中开启。

在生产环境中,断言的开销可能会影响程序的性能,而且断言失败时会终止程序的执行,可能导致严重的后果。

因此,在发布程序之前,应该关闭或移除所有的断言。

断言的设计应该尽量简单和明确。

断言的表达式应该是简单和直观的,便于阅读和理解。

如果断言的表达式过于复杂或难以理解,可能会导致开发人员对程序的行为和预期的理解产生误解。

断言的使用应该谨慎。

断言应该用于检查那些永远不应该发生的情况,而不是用于检查可能发生的情况。

如果断言的条件可能在正常情况下发生,那么就应该使用其他方法来处理这种情况,而不是依赖于断言。

assert用法总结

assert用法总结

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression );assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。

请看下面的程序清单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;}[root@localhost error_process]# gcc badptr.c[root@localhost error_process]# ./a.outa.out: badptr.c:14: main: Assertion `fp' failed.已放弃使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含#include <assert.h>的语句之前插入#define NDEBUG 来禁用assert调用,示例代码如下:#include <stdio.h>#define NDEBUG#include <assert.h>用法总结与注意事项:1)在函数开始处检验传入参数的合法性如:int resetBufferSize(int nNewSize){//功能:改变缓冲区大小,//参数:nNewSize 缓冲区新长度//返回值:缓冲区当前长度//说明:保持原信息内容不变nNewSize<=0表示清除缓冲区assert(nNewSize >= 0);assert(nNewSize <= MAX_BUFFER_SIZE);...}2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);好: assert(nOffset >= 0);assert(nOffset+nSize <= m_nInfomationSize);3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题错误: assert(i++ < 100)这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

assert函数用法

assert函数用法

assert函数用法1. 什么是assert函数在编程中,assert函数被用于断言一个条件是否为真。

当给定的条件为假时,assert函数会抛出AssertionError异常。

它是一种用于调试和测试的工具,可以用来检查前置条件、后置条件、循环不变量等。

使用assert函数可以提前捕捉到程序中的错误条件,从而加快调试和定位错误的速度。

2. assert函数的基本语法assert语句的基本语法如下:assert expression [, arguments]•expression:需要进行断言的条件,当该条件为假时,assert语句会抛出AssertionError异常。

•arguments:可选参数,用于传递给AssertionError异常的附加信息,可以是字符串、数字或其它对象。

3. assert函数的使用场景assert函数一般用于以下几种场景:3.1. 检查前置条件在编写函数或方法时,我们经常需要检查输入参数是否满足一定的前置条件。

使用assert函数可以简化检查的逻辑,例如:def divide(x, y):assert y != 0, "除数不能为零"return x / y在这个例子中,assert语句用于检查除数是否为零,如果为零则抛出AssertionError异常并提示“除数不能为零”。

3.2. 检查后置条件对于一些需要满足一定条件的返回值,我们可以使用assert函数来检查后置条件。

例如:def get_positive_number():x = int(input("请输入一个正整数:"))assert x > 0, "输入必须为正整数"return x在这个例子中,assert语句用于检查用户输入的是否为正整数,如果不是则抛出AssertionError异常并提示“输入必须为正整数”。

3.3. 检查循环不变量在循环中,我们可以使用assert函数来检查循环不变量是否满足预期。

c语言assert函数

c语言assert函数

c语言assert函数c语言assert函数是一种实用的调试工具,它在编程过程中可以帮助开发者迅速发现程序中存在的问题。

assert函数一般用来检查表达式是否成立,如果不成立,则抛出一个自定义的断言错误信息。

本文将详细介绍c语言assert函数的原理、用法,以及assert函数的优缺点。

assert函数的原理与用法assert函数的原理很简单,它就是一段内联的C语言函数,这段函数定义了一个叫做assert的宏,它的工作原理是将它的第一个参数(表达式)计算为0或非0,如果为0,就执行第二个参数(断言错误信息)。

assert函数的格式是:assert(expression, message),其中expression表达式是一个用户自定义的表达式,message是用户可以自定义的断言错误信息。

assert函数的使用方式有多种:(1)通过#include<assert.h>引入assert.h头文件,然后使用assert()函数。

(2)使用宏定义(#define),定义一个assert宏函数,调用assert函数,之后直接使用该宏函数进行调用。

assert函数的优点assert函数是一种常见的调试技术,它可以在编程过程中发现程序中存在的问题,从而帮助开发者及时发现程序的 bug,提高程序的质量。

另外,assert函数的实现简单,只需要简单的函数宏定义,不用太多额外的时间和空间,可以大大简化编程过程。

assert函数的缺点但是assert函数也有一些缺点,例如,它只能检测一些简单的表达式,无法检测复杂的异常情况。

另外,assert函数不能保证程序正确运行,只能提示程序可能存在的问题,最终还是要依靠开发者去检查和修正程序代码。

总结总之,c语言的assert函数是一种简单而有效的实用调试工具,函数的格式简单,实现容易,可以帮助开发者及时发现程序中存在的问题,进而提高程序的质量。

但是assert函数仍然存在一些缺点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

下面就由小编为大家介绍一下C语言中assert的用法,希望对大家有所帮助!
#include
void assert( int expression );
assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr 打印一条出错信息,
然后通过调用abort 来终止程序运行。

请看下面的.程序清单badptr.c:
代码如下:
#include
#include
#include
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;
}
宏名: assert
功能: 测试一个条件并可能使程序终止
用法: void assert(int test);
程序例:
代码如下:
#include
#include
#include
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;
}
assert() 宏用法
注意:assert是宏,而不是函数。

在C的assert.h头文件中。

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
代码如下:
#include
void assert( int expression );
assert的作用是先计算表达式expression,如果其值为假(即为0),那么它先向标准错误流stderr打印一条出错信息,然后通过调用abort来终止程序运行;否则,assert()无任何作用。

宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值。

完成调试后,不必从源代码中删除assert()语句,因为宏NDEBUG有定义时,宏assert()的定义为空。

相关文档
最新文档