将assert()与消息一起使用

mah*_*ood 0 c c++ assert

是否有可能在断言错误上写一条消息?

例如,使用#include <assert.h>,我只能写:

void foo(int a, int b) {
  assert (a != b);
}
Run Code Online (Sandbox Code Playgroud)

然而,在一个错误我想看到的价值ab.我怎样才能做到这一点?

lar*_*moa 7

我通常简单地使用assert(a != b && "This is my error message"). 这是有效的,因为char*可以转换为 bool 并且它永远不会是假的(因为地址不是 0)。


Som*_*ude 6

assert只是一个预处理器宏,如果条件失败则调用abort.您可以使用简单的if语句轻松创建自己的语句,如果失败则打印值并调用abort如下assert:

void foo(int a, int b)
{
    if (a != b)
    {
        std::cerr << "My own assertion failed: a = " << a << ", b = " << b << '\n';
        abort();
    }

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

但是,当您使用C++时,您应该抛出异常,可能是std::logic_error:

void foo(int a, int b)
{
    if (a != b)
    {
        std::istringstream is;
        is << "Argument mismatch in `foo`: a = " << a << ", b = " << b;
        throw std::logic_error(is.str());
    }

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

  • 对于断言,我认为也应该使用#ifdef DEBUG (2认同)