assert()函数用法总结,assert()函数作用

  assert()函数用法总结,assert()函数作用

  出发地:http://www..com/ggzss/archive/2011/08/18/2145017.html,谢谢!

  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()的缺点是频繁调用会极大影响程序性能,增加额外开销。调试后,可以通过在包含# includeassert.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不能代替条件过滤。Assert用于避免明显的错误,而不是处理异常。错误不同于异常。错误不应该出现,例外是不可避免的。c语言的异常可以通过条件判断来处理,其他语言都有自己的异常处理机制。

  使用assert的一个很简单的规则是,在方法或函数的开头,如果在方法中间使用,就要仔细考虑是否合适。方法一开始没有启动一个功能流程,一个功能流程执行中出现的问题几乎都是异常的。

assert()函数用法总结,assert()函数作用