【问题标题】:Ensures() - guideline support libraryEnsures() - 指南支持库
【发布时间】:2016-07-20 20:36:15
【问题描述】:

我想了解如何在代码中使用Ensures()。如example 中给出的,如果我尝试使用Ensures() 如下...

int main(void)
{
    int result = 0;
    // Some calculation
    Ensures(result == 255);
    return 0;
}

如果result 变量不等于255,程序将崩溃并显示以下输出"terminate called without an active exception"。我的问题是如何正确使用Ensures()

【问题讨论】:

  • 如果在您的示例中调用了 std::terminate,那么它按原样工作。

标签: c++ c++11 cpp-core-guidelines guideline-support-library


【解决方案1】:

您使用的是Microsoft GSL implementation 吗?然后,如果您检查the gsl_assert.h header file,您将看到如果定义了GSL_TERMINATE_ON_CONTRACT_VIOLATION(这是默认值),那么Ensures 将调用std::terminate,这会给您带来您得到的错误。

如果您希望抛出异常(带有文件和行号信息),那么您需要在包含 GSL 之前定义 GSL_THROW_ON_CONTRACT_VIOLATION

至于你是否正确使用Ensures,那么是的。


2021 年更新

GSL_TERMINATE_ON_CONTRACT_VIOLATION 被删除,始终调用terminate()

【讨论】:

  • 谢谢您的回复,会检查标题。
  • 我没有使用 MS GSL。我尝试将 MS GSL 与 Visual Studio 2013 一起使用。但收到“致命错误 C1001:编译器中发生内部错误”。
  • 根据您的建议,我进入“gsl-lite.h”并将 #define gsl_CONFIG_THROWS_FOR_TESTING 0 修改为 #define gsl_CONFIG_THROWS_FOR_TESTING 1。现在我得到了异常,我可以抓住它。谢谢。
  • 根据核心指南作者的决定,MS GSL 最近删除了GSL_THROW_ON_CONTRACT_VIOLATION,现在总是删除std::terminates。但是...由于核心准则似乎与 Expects 的行为不一致,因此仍在进行讨论。
猜你喜欢
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多