如何才能完全禁用对assert()的调用?

发布于 2024-10-22 15:25:38 字数 198 浏览 2 评论 0原文

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

如何在编译时完全禁用断言?我是否应该在我生成的任何构建中显式定义 NDEBUG,无论它们是调试、发布还是其他?

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

书信已泛黄 2024-10-29 15:25:38

您必须#define NDEBUG(或使用标志-DNDEBUGg++),只要它在包含之前定义,这就会禁用断言断言头文件。

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

非要怀念 2024-10-29 15:25:38

使用#define NDEBUG

7.2 诊断

1 标头定义 assert 宏并引用另一个宏,

NDEBUG

它不是由定义的。
如果在源文件中包含 NDEBUG 的位置处将 NDEBUG 定义为宏名称,则定义 assert
简单地就像

#define 断言(忽略) ((void)0)

每次执行时都会根据NDEBUG的当前状态重新定义assert宏。
包含

Use #define NDEBUG

7.2 Diagnostics

1 The header defines the assert macro and refers to another macro,

NDEBUG

which is not defined by <assert.h>.
If NDEBUG is defined as a macro name at the point in the source file where is included, the assert macro is defined
simply as

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

The assert macro is redefined according to the current state of NDEBUG each time that
<assert.h> is included.

煮茶煮酒煮时光 2024-10-29 15:25:38

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

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

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

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

眼前雾蒙蒙 2024-10-29 15:25:38

您可以完全禁用断言

#define NDEBUG
#include <assert.h>

,也可以在 makefile/build 过程中设置 NDEBUG(通过 -DNDEBUG),具体取决于您想要生产版本还是开发版本。

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.

巨坚强 2024-10-29 15:25:38

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文