我曾经在一家公司工作,其中一些首席架构师/开发人员在各种项目中强制要求不得使用断言,并且通常会从代码中删除它们并用异常替换它们。
我觉得它们对于编写正确的代码非常重要。任何人都可以建议如何证明这样的授权是合理的吗?如果是这样,断言有什么问题?
最佳答案
根据 JaredPar 的评论,我们使用了修改后的 assert 版本,其作用类似于契约(Contract)。此版本被编译到发布代码中,因此存在较小的开销,但除非设置了诊断开关,否则将被禁用,从而将性能开销降至最低。在这种情况下,我们的断言处理程序可以设置为禁用、静默模式(例如,记录到文件)或嘈杂模式(例如,使用 abort/ignore 在屏幕上显示,abort 会引发异常)。
我们在预发布测试中使用了自动化回归测试,并且断言在这里非常重要,因为它们使我们能够发现无法在 GUI 级别发现的潜在内部错误,并且在最初可能不会致命用户级别。通过自动化,我们可以在有和没有诊断的情况下运行测试,除了执行时间之外几乎没有开销,因此我们还可以确定断言是否有任何其他副作用。
使用断言要小心的一件事是副作用。例如,您可能会看到类似 assert(MyDatabasesIsOk()) 的内容,它会无意中更正数据库中的错误。这是一个错误,因为断言不应该改变正在运行的应用程序的状态。
关于c++ - 断言总是不好的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419406/