当前位置:  开发笔记 > 编程语言 > 正文

什么是断言?你为什么要用它们?

如何解决《什么是断言?你为什么要用它们?》经验,为你挑选了3个好方法。

如何在c ++中完成断言?示例代码表示赞赏.



1> andygeers..:

断言是一种明确检查代码所做假设的方法,它可以通过缩小可能存在的问题来帮助您追踪大量错误.它们通常仅在应用程序的特殊"调试"版本中进行评估,因此它们不会减慢最终版本的速度.

假设您编写了一个将指针作为参数的函数.你的代码很可能会认为指针是非NULL的,那么为什么不用断言显式检查呢?这是如何做:

#include 

void function(int* pointer_arg)
{
    assert(pointer_arg != NULL);

    ...
}

需要注意的一件重要事情是,断言的表达式必须永远不会产生副作用,因为它们不会出现在发布版本中.所以永远不要做这样的事情:

assert(a++ == 5);

有些人还喜欢在他们的断言中添加一些消息,以帮助赋予他们意义.由于字符串总是evonlates为true,你可以这样写:

assert((a == 5) && "a has the wrong value!!");



2> Pieter..:

断言是布尔表达式,通常应该始终为真.

它们用于确保您所期望的是什么.

void some_function(int age)
{
     assert(age > 0);
}

你编写了处理年龄的函数,你也"知道"你总是通过合理的论证,然后使用断言.这就像说"我知道这永远不会出错,但如果确实如此,我想知道",因为,好吧,每个人都会犯错误.

因此,不是要检查合理的用户输入,如果有可能出现问题的情况,请不要使用断言.做真正的检查并处理错误.

断言通常仅用于调试版本,因此不要在断言中添加带副作用的代码.



3> SmacL..:

断言用于验证设计假设,通常根据输入参数和返回结果.例如

// Given customer and product details for a sale, generate an invoice

Invoice ProcessOrder(Customer Cust,Product Prod)
{
  assert(IsValid(Cust));
  assert(IsValid(Prod);
'
'
'
  assert(IsValid(RetInvoice))
   return(RetInvoice);

}

代码运行不需要断言语句,但它们检查输入和输出的有效性.如果输入无效,则调用函数中存在错误.如果输入有效且输出无效,则此代码中存在错误.有关断言使用的更多详细信息,请参阅合同设计.

编辑:正如其他帖子所指出的,assert的默认实现不包含在发布运行时中.许多人会使用的常见做法(包括我自己)是将其替换为发布版本中包含的版本,但仅在诊断模式下调用.这样就可以通过完整的断言检查对发布版本进行适当的回归测试.我的版本如下;

extern  void _my_assert(void *, void *, unsigned);

#define myassert(exp)                               \
{                                                   \
    if (InDiagnostics)                              \
        if ( !(exp) )                               \
            _my_assert(#exp, __FILE__, __LINE__);   \
}                                                   \

这种技术有一个很小的运行时间开销,但它可以跟踪任何使其进入字段的错误更容易.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有