C ++断言消息

时间:2014-04-20 23:51:15

标签: c++ assert

我很快就想弄清楚断言的“自定义消息”是什么。我似乎无法找到答案。

即:

int x = -1; 
assert (x > 0 && "Number must be above 0");

消息实际输出在哪里?因为我尝试时确实没有显示它。

3 个答案:

答案 0 :(得分:2)

由于assert通常是这样实现的(可能要复杂得多,但在这里简化了)

#define assert(x) if (!x) { assert_fail(#x, __FILE__, __LINE__); }

void assert_fail(const char *str, const char *file, int line)
{
  std::cerr << "Assertion failed " << str << " " << file << ":" << line << std::endl;
  abort();
}

然后将&& "Some string"添加到条件中将使断言也打印消息。这对于确定它出错的原因非常方便。我在我的代码中使用了这个确切的模式。

当然,某些assert实现不会打印失败的条件,在这种情况下您将看不到该字符串。您可以通过将现有assert替换为my_assert并使用上述内容来解决此问题。

如果您在调试器中运行代码(例如在IDE中),它也会派上用场,其中字符串将与调试器因断言停止时的条件一起显示(它可能会停止在调优器内部的某个位置)代码,但如果你退回调用堆栈,它最终会到达断言的位置,你可以看到消息是什么)。

答案 1 :(得分:1)

它本身不输出任何内容,但允许我们在检查时看到字符串。 基本上,由于字符串作为表达式是真的,我们可以将它标记为任何断言,当表达式的其他部分失败时它将存在。

因此,在assert打印到stderr的情况下,许多实现都会这样做,输出类似于Assertion 'x > 0 && "Number must be above 0"',在大多数情况下都会出现在unix平台上。

在定义了NDEBUG的情况下,它只是一个无操作和预处理。

答案 2 :(得分:0)

当您确定程序中的变量始终具有某些已定义的值/值范围并且是否采用任何其他值时,将使用断言消息,它应指示代码中的错误将导致程序崩溃,它将打印断言消息。

在您的情况下,当我运行您的代码时,我得到:

a.out: del.c:7: main: Assertion `x > 0 && "Number must be above 0"' failed.
Aborted (core dumped)