如何在C / C ++中将assert放入发布版本中

我只需要运行ship build,我需要在发布版本中断言某些条件以查看问题是否已修复。 我该怎么做?

为什么不定义自己的断言:

 #define assert(x) MessageBox(...); 

取消定义NDEBUG宏 – 您可以围绕要保留在构建中的断言在本地执行此操作:

 #undef NDEBUG #include  // reinclude the header to update the definition of assert() 

或者做任何你需要做的事情,这样你的构建过程就不会首先定义NDEBUG宏。

只需直接调用在发布模式下处于活动状态的assert宏定义部分。

在Miro Samek的这篇伟大文章中,您可以找到非常有用的C ++断言定义。 然后你可以稍微调整它们以满足你的需求。 例如,您可以创建另一个宏release_assert ,它与assert一样,但无论它是处于释放模式还是调试模式。

ASSERT的默认行为是在Debug配置下中止程序,但这通常在Release配置下变为no-op。 我相信它通过检查预处理器NDEBUG宏的存在来做到这一点。 我现在不在工作所以不能检查这个。

我认为最简单的方法是修改Debug配置,将所有优化调整到与Release(内存中的O2)相同的级别,然后重新构建软件。 这将为您提供Release版本的等效性能和速度,但它仍将定义NDEBUG预处理器宏,这意味着所有失败的ASSERT仍将导致程序中止。 请记住稍后再更改优化级别,否则您将无法在Debug配置下进行调试。

一般来说,ASSERT只应用于编程前提条件,永远不要处理运输软件中的故障。 您希望在开发过程中快速失败,但要在用户面前优雅地失败。

我喜欢定义它来抛出从std :: runtime_error派生的某种assert_exception。 然后抓住它并做一些有用的事情。

实际上 – 如果你能使用它,我会选择发送调试版本。 如果您不需要发行版的性能,请使用debug。 它往往是有更少的错误(这是一个粗略的过度简化,如果您的程序没有错误,只是切换到发布不会改变这一点,但由于编译器在调试模式下做的事情,错误可能不会发生和/或有不太严重的后果)。

也许也可以只优化程序的时间关键部分。

它还可以简化调试。

使用Visual Studio时,您可以在发布版本中将NDEBUG预编译器定义取消定义为活动断言。

例如,您可以在/ U选项的Projekt设置中设置$(undefesTheNDEBUG),然后将环境变量undefesTheNDEBUG定义为NDEBUG(SET undefesTheNDEBUG = NDEBUG)或将其与msbuild一起传递(/ p:undefesTheNDEBUG = NDEBUG)