C语言中assert()函数的用法总结

一、原型定义

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

原型定义:

#include <assert.h>
void assert( int expression );

二、作用

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

请看下面的程序Untitled-1.c:

#include <stdio.h>
#include <assert.h>

int main(int argc, char const *argv[])
{
    int i = 0;

    while (1)
    {
        i++;

        printf("Before assert is %d.\n", i);
        
        assert(i <= 5);
        
        printf("After assert is %d.\n", i);	//当i>5时,不会执行到这一句
    }
    
    return 0;
}

运行结果如下:

Before assert is 1.
After assert is 1. 
Before assert is 2.
After assert is 2. 
Before assert is 3.
After assert is 3. 
Before assert is 4.
After assert is 4. 
Before assert is 5.
After assert is 5. 
Before assert is 6.
Assertion failed!

Program: C:\***\Desktop\Untitled-1.exe
File: Untitled-1.c, Line 13

Expression: i <= 5

三、缺点

频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include <stdio.h>
#define NDEBUG
#include <assert.h>

四、用法总结与注意事项

1. 在函数开始处检验传入参数的合法性,如:

/**
 * 功能:改变缓冲区大小,
 * 参数:nNewSize 缓冲区新长度
 */
int resetBufferSize(int nNewSize)
{
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  
  ...	//只有当参数nNewSize的值符合上面两个条件时,才会执行到这里
}

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(i < 100);

i++;

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

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


参考链接:https://www.cnblogs.com/cpoint/p/3367326.html

  • 23
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值