【发布时间】:2008-11-06 22:01:32
【问题描述】:
我正在使用 VC++。 assert(false) 在发布模式下会被忽略吗?
【问题讨论】:
标签: c++ visual-c++ posix assert
我正在使用 VC++。 assert(false) 在发布模式下会被忽略吗?
【问题讨论】:
标签: c++ visual-c++ posix assert
如果在发布模式下编译包括定义NDEBUG,那么是的。
【讨论】:
IIRC,assert(x) 是一个宏,在定义 NDEBUG 时计算结果为空,这是 Visual Studio 中发布版本的标准。
【讨论】:
assert 宏(至少它通常是一个宏)通常在发布代码中定义为无操作。它只会在调试代码中触发。话说回来。我曾在定义了自己的断言宏的地方工作过,它在调试和发布模式下都触发了。
我被教导将断言用于“永远”不会为假的条件,例如函数的前置条件。
【讨论】:
我认为只有定义了 NDEBUG(Visual C++ 应用程序默认使用它)。
【讨论】:
我认为过分依赖断言的确切行为是错误的。 "assert(expr)" 的正确语义是:
【讨论】:
NDEBUG 在包含<assert.h> 之前未定义),那么如果assert 的控制表达式比较等于零,然后表达式的文本、文件和行号将打印在标准错误流上的一些实现定义的消息中。然后调用abort 函数。 (从 C99 开始,消息还需要包含函数名称。)
GNU 也一样:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
【讨论】: