如何在c ++中完成断言?示例代码表示赞赏.
断言是一种明确检查代码所做假设的方法,它可以通过缩小可能存在的问题来帮助您追踪大量错误.它们通常仅在应用程序的特殊"调试"版本中进行评估,因此它们不会减慢最终版本的速度.
假设您编写了一个将指针作为参数的函数.你的代码很可能会认为指针是非NULL的,那么为什么不用断言显式检查呢?这是如何做:
#includevoid function(int* pointer_arg) { assert(pointer_arg != NULL); ... }
需要注意的一件重要事情是,断言的表达式必须永远不会产生副作用,因为它们不会出现在发布版本中.所以永远不要做这样的事情:
assert(a++ == 5);
有些人还喜欢在他们的断言中添加一些消息,以帮助赋予他们意义.由于字符串总是evonlates为true,你可以这样写:
assert((a == 5) && "a has the wrong value!!");
断言是布尔表达式,通常应该始终为真.
它们用于确保您所期望的是什么.
void some_function(int age) { assert(age > 0); }
你编写了处理年龄的函数,你也"知道"你总是通过合理的论证,然后使用断言.这就像说"我知道这永远不会出错,但如果确实如此,我想知道",因为,好吧,每个人都会犯错误.
因此,不是要检查合理的用户输入,如果有可能出现问题的情况,请不要使用断言.做真正的检查并处理错误.
断言通常仅用于调试版本,因此不要在断言中添加带副作用的代码.
断言用于验证设计假设,通常根据输入参数和返回结果.例如
// 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__); \ } \
这种技术有一个很小的运行时间开销,但它可以跟踪任何使其进入字段的错误更容易.