在我的程序中,我想使用显示错误消息的断言.除了众所周知的C和C++的解决方法之外,还有BOOST提供的"真实"解决方案BOOST_ASSERT_MSG( expr, msg )(另请参见带有消息的assert())
但是静态消息对我来说还不够,我还想有时候显示失败的变量,例如在类似的情况下
BOOST_ASSERT_MSG( length >= 0, "No positive length found! It is " << length )
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我想将消息"string"格式化为stringstream或者ostream允许我轻松地显示自定义类型(假设我已经定义了相关的格式化函数).
这里的问题是BOOST_ASSERT_MSG默认情况下要求char const *不兼容.
有没有办法重新定义/重载assertion_failed_msg(),使用流作为消息将起作用?怎么样?
(我的天真方法失败了,因为编译器首先要对operator<<("foo",bar)消息本身做一个...)
在回答这个问题时,我遇到了这个代码......
#include <iostream>
int main()
{
int const income = 0;
std::cout << "I'm sorry your income is: " < income; // this is line 6
}
Run Code Online (Sandbox Code Playgroud)
...其中包含拼写错误.第<<6行的第二个(预期)操作符被意外写为a <.
除此之外,使用GCC 4.3.4或4.4.3 编译代码会产生警告:
prog.cpp: In function ‘int main()’:
prog.cpp:6: warning: right-hand operand of comma has no effect
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么会产生特别警告?它指的是哪个逗号运算符?
注意:我并不是主张<在cout声明中故意使用单曲. 我只是偶然发现了这个警告,同时试图找出我已经链接到的另一个问题的答案,并且好奇为什么编译器会生成它.
是否有可能在断言错误上写一条消息?
例如,使用#include <assert.h>,我只能写:
void foo(int a, int b) {
assert (a != b);
}
Run Code Online (Sandbox Code Playgroud)
然而,在一个错误我想看到的价值a和b.我怎样才能做到这一点?