我的代码充满了对的调用assert(condition)
。在调试版本中,我使用g++ -g
它触发我的断言。出乎意料的是,在我的发行版本中也触发了相同的断言,即没有-g
选项的情况下编译的断言。
如何在编译时完全禁用我的断言?我应该NDEBUG
在生产的任何版本中明确定义,而不管它们是调试,发布还是其他任何形式?
我的代码充满了对的调用assert(condition)
。在调试版本中,我使用g++ -g
它触发我的断言。出乎意料的是,在我的发行版本中也触发了相同的断言,即没有-g
选项的情况下编译的断言。
如何在编译时完全禁用我的断言?我应该NDEBUG
在生产的任何版本中明确定义,而不管它们是调试,发布还是其他任何形式?
Answers:
您必须#define NDEBUG
(或将标志-DNDEBUG
与g ++一起使用)将禁用断言,只要在包含断言头文件之前就已定义断言即可。
#include <assert.h>
?
#include <assert.h>
。
采用 #define NDEBUG
7.2诊断
1标头定义断言宏并引用另一个宏,
NDEBUG
并未由定义
<assert.h>
。如果在包含源文件的位置将NDEBUG定义为宏名称,则assert宏的定义简单为
#define assert(ignore) ((void)0)
该断言宏是根据当前的状态定义忠告音响NDEBUG每个时间
<assert.h>
被包括。
;
,例如,如果assert
在内,则可能会出现问题if
。我确信,编译器优化般的线条0;
远
-g
则等效于-g2
。-g3
可能会是一个更好的选择,因为它可以提供最多的符号信息。例如,在处-g3
,符号#defines将可用。不过,我似乎有些工具链cho之以-g3
鼻。同样,许多外部库也依赖于-DDEBUG
“调试”构建(Posix仅证明适用-DNDEBUG
于“发行”构建)。