C++断言消息
C++ Assert Message
我真的很快就想弄清楚断言的"自定义消息"的作用。我似乎找不到答案。
即:
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)
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- 使用 Microsoft VS 编写程序C++,但我在这里收到调试断言消息.它可以在 cpp.sh 上运行,repl.i
- 将断言消息写入日志文件
- 使用分位数函数提升断言失败的消息
- 在尝试使用boost时断言.跨很多过程中的互动消息队列
- git_clone错误消息断言失败:git_atomic_get(&git__n_inits) > 0
- 如何使用可选的格式化消息实现符合标准的断言宏?
- 在一行中断言:AreEqual格式的消息
- 使用 CppUnit 和 TFS2015 时"断言失败"消息不完整
- 带有自定义消息的基于模板的编译时断言只能在某些编译器中编译
- 调试断言失败消息
- C++断言消息