如何完全禁用断言

我有我的代码充满了调用assert(condition) 。 在debugging版本中,我使用g++ -g开发我的断言。 令我惊讶的是,我可以在我的发行版本中看到assertion,也就是没有使用-g选项编译的版本。

我怎么能在编译时完全禁用我的断言? 我应该在任何构build中明确定义NDEBUG ,尽pipe它们是debugging,发布或任何其他的东西?

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

使用#define NDEBUG

7.2诊断

1头部定义了断言macros,并引用另一个macros,

NDEBUG

这不是由<assert.h>定义的。 如果NDEBUG被定义为包含在源文件中的macros名称,那么assertmacros被定义为

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

每当包含<assert.h>时, 断言macros都会根据NDEBUG的当前状态进行重新定义。

你可以完全禁用断言

 #define NDEBUG #include <assert.h> 

或者你可以在你的makefile / build程序中设置NDEBUG(通过-DNDEBUG),这取决于你是否想要一个高效版本或开发版本。

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

设置NDEBUG是禁用断言的标准(正式的,ISO标准)。

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

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