如何完全禁用断言

Abr*_*ile 70 c c++ assert

我的代码充满了召唤assert(condition).在调试版本中,我使用了g++ -g我的断言.令我惊讶的是,我可以看到断言也在我的发布版本中运行,编译时没有-g选项.

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

GWW*_*GWW 90

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

  • 必须在`#include <assert.h>`之前? (2认同)
  • @LeiYang 似乎必须在最后一个 `#include <assert.h>` 之前添加。 (2认同)

Pra*_*rav 34

使用 #define NDEBUG

7.2诊断

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

NDEBUG

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

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

断言宏是根据当前的状态定义忠告音响NDEBUG每个时间 <assert.h>被包括.

  • @Abruzzo 没有代码是什么意思?((void)0) 不会在可执行文件中生成任何代码。标准要求断言可以在任何可以使用 void 类型的表达式的地方使用,因此仅将其替换为不带标记的东西是行不通的。 (2认同)

dcn*_*dcn 10

您可以完全禁用断言

#define NDEBUG
#include <assert.h>
Run Code Online (Sandbox Code Playgroud)

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


Aln*_*tak 10

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

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


Fre*_*Foo 6

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

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