31

我正在使用 VC++。在发布模式下被assert(false)忽略?

4

6 回答 6

32

如果在发布模式下编译包括定义 NDEBUG,那么是的。

断言 (CRT)

于 2008-11-06T22:07:25.707 回答
7

IIRC,assert(x) 是一个宏,在定义 NDEBUG 时计算结果为空,这是 Visual Studio 中发布版本的标准。

于 2008-11-06T22:05:27.393 回答
6

断言宏(至少它通常是一个宏)通常在发布代码中定义为无操作。它只会在调试代码中触发。话说回来。我曾在定义了自己的断言宏的地方工作过,它在调试和发布模式下都触发了。

我被教导将断言用于“永远不会”为假的条件,例如函数的先决条件。

于 2008-11-06T22:07:19.857 回答
2

我认为只有定义了 NDEBUG (Visual C++ 应用程序默认使用它)。

于 2008-11-06T22:05:40.530 回答
1

我认为过分依赖断言的确切行为是错误的。“assert(expr)”的正确语义是:

  • 表达式 expr 可能会或可能不会被评估。
  • 如果 expr 为真,则继续正常执行。
  • 如果 expr 为假,则发生的情况未定义。

更多信息请访问http://nedbatchelder.com/text/assert.html

于 2008-11-07T01:15:01.833 回答
0

GNU 也一样:

  #ifdef    NDEBUG

  # define assert(expr)     (__ASSERT_VOID_CAST (0))
于 2012-03-23T09:32:43.117 回答