C++断言的相关介绍(转载)


作者:炫目萧萧
来源:CSDN
原文:https://blog.csdn.net/u013230511/article/details/77142037
版权声明:本文为博主原创文章,转载请附上博文链接!

断言

断言是什么?简单而言,断言是对某种假设条件进行检查。
C语言中,在assert.h中,断言被定义为宏的形式(assert(expression)),而不是函数。
assert将通过检查表达式的值来决定是否需要终止程序,如果表达式为真(1)则忽略断言,程序继续运行。如果表达式为假(0),那么首先向错误流strerr打印一条错误信息,然后通过abort函数终止程序的运行。

断言用法的简单例子:

int a,b;
 a = 1;
 b = 1 ;
 assert(b!=0);
 printf("a/b = %d\n",a/b);

通过查看assert.h,NDEBUG宏打开状态时assert宏是可用的。
默认情况下,assert宏只有在Debug版本才起作用,而在Release版本中将被忽略。但在许多操作系统的C程序中,Release版本中也将NDEBUG宏依然为打开状态。
也便是说如果需要用到断言时,用户可以通过重定义自己的ASSERT。例子如下:

#ifdef DEBUG
#define ASSERT(condition) \
    do{ \
        if(condition) \
        {  \
            NULL; \
        } \
        else{ \
            assert(condition); \
        }     \
    }while(0)
#else
#define ASSERT(condition) NULL
#endif

避免使用断言去检查程序错误

在断言的使用中,应该遵循这样的一个规定:对来自系统内部的可靠数据使用断言,对于外部不可靠数据不能使用断言,而应该使用错误处理代码。
换句话而言,断言是用来处理不应该发生的非法情况,而对于可能发生的应该使用错误处理代码。
对于用户输入,与外部系统进行协议交互时的情况,也不能使用断言进行参数的判断,这种情况属于正常的错误检查。

下面的例子说明了断言的使用场景

char * Strdup(const char * src){
    assert(src!=NULL);

    char * result = NULL;
    size_t len = strlen(src) +1;
    result = (char *)malloc(len);

    assert(result != NULL);
    return result;
}

例子中第一个断言assert(src!=NULL)用于判断传入的参数的正确性,保证参数不为NULL
第二个断言assert(result != NULL)检查函数返回值是否为NULL。
例子中的两个断言,第一个是合法的,而第二个不合法,第一个合法是因为传入的参数必须不为NULL,断言如果成功,则说明调用代码存在问题,这属于非法的情况,此处属于断言的正确使用情况。
第二个断言则不同,malloc对于返回NULL的情况属于调用正常情况,这应该使用正常的错误处理逻辑,不应该使用断言。

避免在断言表达式中使用改变上下文的语句

在assert宏只有在Debug版本中情况下,应该避免断言表达式中使用改变环境的语句。

如下例子因为断言语句的缘故,将导致不同的编译版本产生不同的结果。

int test(int i)
{
    assert(i++);
    return i;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值