【发布时间】:2015-03-18 10:42:19
【问题描述】:
有什么方法可以关闭断言而不是切换到发布模式。我需要调试一个经常做出断言的代码,这会减慢我的工作速度。 这些断言与我要解决的问题无关,所以现在它们只会减慢我的进度,因为它们在我的一个基类中经常被调用。 现在我没有时间改进他们的设计,所以有人可以告诉我是否有办法在调试模式下关闭断言并使用它的功能。
【问题讨论】:
有什么方法可以关闭断言而不是切换到发布模式。我需要调试一个经常做出断言的代码,这会减慢我的工作速度。 这些断言与我要解决的问题无关,所以现在它们只会减慢我的进度,因为它们在我的一个基类中经常被调用。 现在我没有时间改进他们的设计,所以有人可以告诉我是否有办法在调试模式下关闭断言并使用它的功能。
【问题讨论】:
您可以添加编译器标志/DNDEBUG 来关闭断言。我觉得这样更简洁,因为您不必更改代码中的任何内容。
您可以使用 /DNDEBUG 命令行选项关闭断言宏,而无需修改源文件。
【讨论】:
我没有 Visual Studio 2013,但以下内容在 Visual Studio 2015 中适用于我,因此对于 VS 2013 来说可能相同或类似。
在你的 main() 函数中,调用
_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
在 Visual Studio 中,转到调试/Windows/异常设置。在异常设置中,转到 Win32 异常/0xc0000420 断言失败。取消选中该条目前面的框。
我需要以上两个来抑制调试模式下的断言弹出窗口。
【讨论】:
您可以使用_set_error_mode 或_CrtSetReportMode(请参阅xMRi 的答案)来更改故障报告方法并避免出现模式对话框。参见那里的代码 sn-p:
int main()
{
_set_error_mode(_OUT_TO_STDERR);
assert(2+2==5);
}
另请注意,断言失败通常是有原因的,您希望修复代码,而不仅仅是禁止报告。将它们从调试版本中完全删除,您只是破坏了为您构建的好东西。
【讨论】:
用户_CrtSetReportMode
int iPrev = _CrtSetReportMode(_CRT_ASSERT,0);
// Start Operation with no ASSERTs
...
// Restore previous mode with ASSERTs
_CrtSetReportMode(_CRT_ASSERT,iPrev);
您可以只使用 _CRTDBG_MODE_DEBUG 而不是使用 0。
【讨论】:
#define NDEBUG 在#include <assert.h> 之前禁用assert 宏。
您可以将其添加到项目设置中的预处理器定义中。
【讨论】:
ASSERT 与标准库 assert 不同,并且控制方式不同。