在声明中添加自定义消息?

有没有办法添加或编辑由assert引发的消息? 我想用类似的东西

assert(a == b, "A must be equal to B"); 

然后,编译器添加时间等…

可能吗?

我见过的黑客是使用&&操作符。 由于指针“真”,如果它是非空的,你可以在不改变条件的情况下执行以下操作:

 assert(a == b && "A is not equal to B"); 

由于assert显示失败的条件,它也会显示你的消息。 如果这还不够,你可以编写你自己的myAssert函数或者macros来显示任何你想要的。

另一种select是反转操作数并使用逗号运算符。 你需要额外的括号,所以逗号不被视为参数之间的分隔符:

 assert(("A must be equal to B", a == b)); 

(这是从上面的评论复制,为了更好的知名度)

 BOOST_ASSERT_MSG(expre, msg) 

http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html

你可以直接使用或者复制Boost的代码。 另外请注意Boost assert只是头文件,所以如果你不想安装所有的Boost,那么你可以抓住那个文件。

由于zneak的答案在一定程度上会使代码变得复杂,所以更好的方法是仅仅评论你正在讨论的string文本。 即:

 assert(a == b); // A must be equal to B 

由于assert错误的读者将从错误信息中查找文件和行,他们将在这里看到完整的解释。

因为在一天结束的时候,

 assert(number_of_frames != 0); // Has frames to update 

读取比这更好:

 assert(number_of_frames != 0 && "Has frames to update"); 

就人类parsing代码而言。 可读性。 也不是一个语言破解。

这里是我的assertmacros的版本,它接受消息并以清晰的方式打印所有内容:

 #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:需要非空参数

预期:ptr!= nullptr

来源:C:\ MyProject \ src.cpp,第22行

干净漂亮,随意在你的代码中使用=)

assert是一个macros/函数组合。 你可以使用__BASE_FILE__ __FILE____BASE_FILE__ __FILE____BASE_FILE__等自定义的函数来定义自己的macros/函数,

为什么没有人提到最干净的解决scheme?

 bool AMustBeEqualToB = (a == b); assert(AMustBeEqualToB); 

对于vc,在assert.h中添加如下代码,

 #define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )