如何完全禁用断言

时间:2011-03-18 15:36:29

标签: c++ c assert

我的代码充满了对assert(condition)的调用。 在调试版本中,我使用g++ -g利用我的断言。 令我惊讶的是,我可以看到断言在我的发布版本中工作,编译没有-g选项。

如何在编译时完全禁用我的断言?我应该在我生成的任何构建中明确定义NDEBUG,尽管它们是调试,发布或其他任何其他构建吗?

5 个答案:

答案 0 :(得分:86)

您必须#define NDEBUG(或使用带有 g ++ 的标志-DNDEBUG)这将禁用断言,只要它在包含断言头文件之前定义。

答案 1 :(得分:34)

使用#define NDEBUG

  

7.2诊断

     

1标题定义断言宏并引用另一个宏,

     

<强> NDEBUG

     

不是由<assert.h>定义的。   如果 NDEBUG 被定义为源文件中包含的宏名称,则断言宏定义为   简单地说就是

     

#define assert(ignore) ((void)0)

     

断言宏根据每次 NDEBUG 的当前状态重新定义   <assert.h>已包含在内。

答案 2 :(得分:10)

您可以通过

完全禁用断言
#define NDEBUG
#include <assert.h>

或者您可以在makefile / build过程中设置NDEBUG(通过-DNDEBUG),具体取决于您是否需要高效或开发版本。

答案 3 :(得分:10)

-g标志不会影响assert的操作,只是确保各种调试符号可用。

设置NDEBUG是禁用断言的标准(如官方,ISO标准)。

答案 4 :(得分:4)

是,使用预处理程序/编译器选项NDEBUG在命令行/构建系统上定义-DNDEBUG

这与-g插入的调试信息无关。