断言

本主题适用于:

版本

Visual Basic

C#

F#

C++

Web Developer

学习版

主题不适用 主题不适用 主题不适用

仅限本机

主题不适用

专业版、高级专业版和旗舰版

主题不适用 主题不适用 主题不适用

仅限本机

主题不适用

断言语句指定在程序的某些特定点应为真的条件。 如果该条件不为真,则断言失败,中断程序的执行,并显示“断言失败”对话框

Visual C++ 支持基于下列构造的断言语句:

断言可以用于:

  • 捕捉逻辑错误。 有关更多信息,请参见捕捉逻辑错误

  • 检查某操作的结果。 有关更多信息,请参见结果检查

  • 测试错误条件,这些错误条件应已处理。 有关更多信息,请参见测试错误条件

MFC 和 C 运行库断言

当调试器由于 MFC 或 C 运行库断言而暂停时,它定位到源文件中的断言发生点(如果源可用)。 断言消息显示在“输出”窗口以及**“断言失败”对话框中。 如果希望保存断言消息以供将来参考,可以将断言消息从“输出”**窗口复制到某个文本窗口。 **“输出”**窗口可能还包含其他错误信息。 请仔细检查这些消息,因为它们提供了有关确定断言失败原因的线索。

通过在代码中大量使用断言,可以在开发期间捕捉许多错误。 为所做的每个假定编写一个断言是很好的规则。 例如,如果假定某个参数不为 NULL,请使用一条断言语句检查该假定。

_DEBUG

仅当定义了 _DEBUG 时断言语句才编译。 未定义 _DEBUG 时,编译器将断言作为空语句处理。 因此,断言语句在最终发布程序中系统开销为零;可以在代码中大量使用断言语句,而不影响“Release”版本的性能,并且不必使用 #ifdef 指令。

使用断言的副作用

当向代码添加断言时,请确保这些断言没有副作用。 例如,考虑以下断言:

ASSERT(nM++ > 0); // Don't do this!

因为在程序的“Release”版本中不计算 ASSERT 表达式,所以 nM 在“Debug”版本和“Release”版本中会有不同值。 在 MFC 中,可以使用 VERIFY 宏代替 ASSERT。 在“Release”版本中,VERIFY 计算该表达式,但不检查结果。

在断言语句中使用函数调用时应特别小心,因为计算函数可能会有意外的副作用。

ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe

VERIFY 在“Debug”版本和“Release”版本中都调用 myFnctn,因此可以使用它。 但在“Release”版本中仍会有因不必要的函数调用而产生的系统开销。

请参见

参考

托管代码中的断言

概念

调试器安全

其他资源

调试本机代码