C++ 如何完全禁用对 assert() 的调用?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5354314/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 17:58:49  来源:igfitidea点击:

How can I completely disable calls to assert()?

c++cassert

提问by Abruzzo Forte e Gentile

My code is full of calls to assert(condition). In the debug version I use g++ -gwhich triggers my assertions. Unexpectedly, the same assertions are also triggered in my release version, the one compiled without -goption.

我的代码充满了对assert(condition). 在我使用的调试版本中g++ -g,它触发了我的断言。出乎意料的是,在我的发布版本中也触发了相同的断言,即没有-g选项编译的版本。

How can I completely disable my assertions at compile time? Should I explicitly define NDEBUGin any build I produce regardless of whether they are debug, release or anything else?

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

回答by GWW

You must #define NDEBUG(or use the flag -DNDEBUGwith g++) this will disable assert as long as it's defined before the inclusion of the assert header file.

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

回答by Prasoon Saurav

Use #define NDEBUG

#define NDEBUG

7.2 Diagnostics

1 The header de?nes the assertmacro and refers to another macro,

NDEBUG

which is not de?ned by <assert.h>. If NDEBUGis de?ned as a macro name at the point in the source ?le where is included, the assertmacro is de?ned simply as

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

The assertmacro is rede?ned according to the current state of NDEBUGeach time that <assert.h>is included.

7.2 诊断

1 头文件定义了assert宏并引用了另一个宏,

调试

哪个不是由 定义的<assert.h>。如果NDEBUG在源文件中包含的点处定义为宏名称,则断言宏定义为

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

断言宏是雷德?根据当前状态定义NDEBUG每个时间 <assert.h>被包括。

回答by dcn

You can either disable assertions completely by

您可以通过以下方式完全禁用断言

#define NDEBUG
#include <assert.h>

or you can set NDEBUG (via -DNDEBUG) in your makefile/build procedure depending on whether you want a productive or dev version.

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

回答by Alnitak

The -gflag doesn't affect the operation of assert, it just ensures that various debugging symbols are available.

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

Setting NDEBUGis the standard (as in official, ISO standard) way of disabling assertions.

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

回答by Fred Foo

Yes, define NDEBUGon the command line/build system with the preprocessor/compiler option -DNDEBUG.

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

This has nothing to do with the debugging info inserted by -g.

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