是否可以在断言错误上写一条消息?
例如,使用#include <assert.h>
,我只能写:
void foo(int a, int b) {
assert (a != b);
}
但是,如果出现错误,我希望看到a
和b
的值。我怎么能这样做?
答案 0 :(得分: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();
}
/* ... */
}
但是,当您使用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());
}
/* ... */
}
答案 1 :(得分:4)
我通常只使用assert(a != b && "This is my error message")
。这是有效的,因为char*
可以转换为bool并且永远不会为false(因为地址不是0)。
答案 2 :(得分:1)
可以编写自己的断言宏,它可以将表达式分解为子表达式并打印每个值的值;但是它需要很多代码才能支持它,标准的assert
宏在我所知道的任何实现上都不会这样做。
有关如何实现此类操作的示例,请参阅CATCH test framework,特别是CHECK
宏的实现。
或者,您可以编写像ASSERT_EQUAL(a,b)
这样的宏或函数,将每个子表达式作为单独的参数。
或者您可以在没有assert
if (a == b) {
throw std::runtime_error("foo: a(" + std::to_string(a) + ") must not equal b");
}