我正在为 VisualStudio 寻找一个好的、功能齐全的 C++ 断言宏。具有能够一次或总是忽略断言、能够准确中断调用宏的位置(而不是宏代码内部)以及获取堆栈跟踪等功能。
在我不得不蹲下来写一个之前,我想我会问是否有人知道那里有任何可用的。
有什么建议么?
谢谢!
我正在为 VisualStudio 寻找一个好的、功能齐全的 C++ 断言宏。具有能够一次或总是忽略断言、能够准确中断调用宏的位置(而不是宏代码内部)以及获取堆栈跟踪等功能。
在我不得不蹲下来写一个之前,我想我会问是否有人知道那里有任何可用的。
有什么建议么?
谢谢!
有关宏的详细讨论,请参阅Charles Nicholson 的博客。assert
他的解决方案在错误的代码行(而不是在失败的断言处理程序内部)中断了调试器,并且他还解决了在禁用断言时不会收到有关未使用变量的警告的问题,而不会产生任何运行时成本。
这是我为 DDJ 写的一篇文章的链接,其中描述了一个库,它可以满足您的大部分需求。虽然我不只是使用宏,但我也在 DLL 中实现函数。
http://www.ddj.com/architect/184406106
几年前的文章,虽然我做了很多补充,但我仍然在我的日常代码中非常自由地使用它。
_ASSERTE在您想要的地方完全中断 - 但不符合您的其他标准。
_ASSERTE 很好,因为它显示了实际的断言文本以及文件名和行号。这意味着您可以这样做:
_ASSERTE(bufLen > 0 && "bufLen needs to be greater than 0");
OpenOffice 有一些断言代码,可以选择记录到消息框。可能不完全是你想要的,但也许有启发性?
我释放了PPK_ASSERT
。虽然它不会打开对话框,但在 Windows 上,默认处理程序会打开一个控制台,您可以在其中读取断言消息并决定采取何种操作。
#include <pempek_assert.h>
int main()
{
float min = 0.0f;
float max = 1.0f;
float v = 2.0f;
PPK_ASSERT(v > min && v < max, "invalid value: %f, must be between %f and %f", v, min, max);
return 0;
}