我很快就想弄清楚断言的“自定义消息”的作用。我似乎找不到答案。
即:
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();
}
然后将 && "Some string"
添加到条件中将使断言也打印消息。这对于确定出错的原因非常方便。我在我的代码中使用了这个确切的模式。
当然,某些assert
实现不会打印失败的条件,在这种情况下您将看不到该字符串。您可以通过将现有的 assert
替换为 my_assert
并使用类似上述内容来解决此问题。
如果您在调试器中(例如在 IDE 中)运行代码,它也会派上用场,其中字符串将与调试器因断言而停止时的条件一起显示(它可能会停止在更深的地方)代码,但如果你返回调用堆栈,它最终会到达断言所在的位置,你可以看到消息是什么)。
关于C++ 断言消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188873/