有没有办法添加或编辑断言抛出的消息?我想用类似的东西
assert(a == b, "A must be equal to B");
然后,编译器添加行,时间等...
可能吗?
zne*_*eak 219
我见过的黑客是使用&&运营商.如果指针"为真",如果它为非空,则可以在不改变条件的情况下执行以下操作:
assert(a == b && "A is not equal to B");
由于assert显示失败的条件,它也会显示您的消息.如果还不够,你可以编写自己的myAssert函数或宏来显示你想要的任何东西.
And*_*tan 40
另一种选择是反转操作数并使用逗号运算符.您需要额外的括号,因此逗号不会被视为参数之间的分隔符:
assert(("A must be equal to B", a == b));
(这是从上面的评论中复制的,以获得更好的可见性)
小智 20
这是我的断言宏版本,它接受消息并以清晰的方式打印出所有内容:
#include <iostream>
#ifndef NDEBUG
#   define M_Assert(Expr, Msg) \
    __M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
#   define M_Assert(Expr, Msg) ;
#endif
void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
    if (!expr)
    {
        std::cerr << "Assert failed:\t" << msg << "\n"
            << "Expected:\t" << expr_str << "\n"
            << "Source:\t\t" << file << ", line " << line << "\n";
        abort();
    }
}
现在,您可以使用它
M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");
如果失败,您将收到如下消息:
断言失败:MyFunction:需要非null参数
预期:ptr!= nullptr
来源:C:\ MyProject\src.cpp,第22行
很好,干净,随意在你的代码中使用=)
Zer*_*ero 18
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
您可以直接使用它或复制Boost的代码.另请注意,Boost断言仅是标头,因此如果您不想安装所有Boost,则可以抓取该单个文件.
由于zneak的回答在某种程度上使代码回旋,更好的方法是仅仅评论您正在谈论的字符串文本.即:
assert(a == b); // A must be equal to B
由于断言错误的读者将从错误消息中查找文件和行,因此他们将在此处看到完整的解释.
因为,在一天结束时,这:
assert(number_of_frames != 0); // Has frames to update
读取比这更好:
assert(number_of_frames != 0 && "Has frames to update");
在人类解析代码方面,即.可读性.也不是语言黑客.
| 归档时间: | 
 | 
| 查看次数: | 57885 次 | 
| 最近记录: |