C++断言消息

C++ Assert Message

本文关键字:消息 断言 C++      更新时间:2023-10-16

我真的很快就想弄清楚断言的"自定义消息"的作用。我似乎找不到答案。

即:

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

消息实际输出到哪里?因为当我尝试时,它肯定没有显示出来。

由于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();
}

则将CCD_ 2添加到条件中也将使assert打印消息。这对于确定出错原因非常方便。我在代码中使用了这个确切的模式。

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

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

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

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

在定义NDEBUG的情况下,它将只是一个非操作,并进行预处理。

当您确信程序中的变量总是有一些定义的值/值范围时,就会使用断言消息,如果它取了任何其他值,它应该指示代码中的错误,这将导致程序崩溃,并打印断言消息。

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

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