我的代码充满了对assert(condition)
的调用。
在调试版本中,我使用g++ -g
利用我的断言。
令我惊讶的是,我可以看到断言在我的发布版本中工作,编译没有-g
选项。
如何在编译时完全禁用我的断言?我应该在我生成的任何构建中明确定义NDEBUG
,尽管它们是调试,发布或其他任何其他构建吗?
答案 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
插入的调试信息无关。