C++ 断言消息

标签 c++ assert

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

即:

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/

相关文章:

c++ - 不能在非 Boost 版本的 Asio 中使用 asio::placeholders::error

c++ - 如何让 g++ 使用移动构造函数编译 c++11 代码?

c++ - 通过多个嵌套协程挂起

c++ - 我可以以这种方式将数组转换为指针并返回指向常量的指针吗?

c# - Assert.NotNull(object anObject) 与 Assert.IsNotNull(object anObject)

c++ - ‘断言’函数: weird behavior

java - 在 Dropwizard 中如何比较 json 中的日期

C++:搜索并写入文件以替换字符串

python - 在方法中使用断言 - Python

python - 尝试断言有关异常的某些内容,但收到 AttributeError?