断言与 C/C++ 中的调试有啥关系? [关闭]
Posted
技术标签:
【中文标题】断言与 C/C++ 中的调试有啥关系? [关闭]【英文标题】:What does assert have to do with debugging in C/C++? [closed]断言与 C/C++ 中的调试有什么关系? [关闭] 【发布时间】:2021-12-25 13:54:31 【问题描述】:试图找出 NDEBUG
和 _DEBUG
在 Visual Studio 中的实际含义,我遇到了一个 cppreference page,它解释了 NDEBUG
是关于 assert
函数是否在代码中起作用。
调试与assert
函数有什么关系?在定义 assert
的行为方式时,为什么我们有名称 NDEBUG
?
更新
为了更准确地提出这个问题,我想知道一些实现细节。 assert
用于调试是什么?我们究竟要断言什么?为什么我们要避免这样的断言?
【问题讨论】:
提示:assert()
不是函数而是宏。现在尝试查找并阅读该宏的定义。另外,做一些研究:***.com/search?q=%5Bc%2B%2B%5D+what+is+assert!
相关:_DEBUG vs NDEBUG
相关:What is the NDEBUG preprocessor macro used for (on different platforms)?
@WeatherVane 我也看到了,其实那个帖子让我更加困惑
断言失败表示存在错误。它是一种检测错误的工具。这就是它与调试的关系。
【参考方案1】:
在调试模式下,宏 NDEBUG 未定义。结果断言被检查。
来自 C 标准(7.2 诊断 )
1 头文件 定义了 assert 和 static_assert 宏 并引用另一个宏,
NDEBUG
不是由 定义的。如果 NDEBUG 被定义为宏 源文件中包含 的位置的名称, 断言宏被简单地定义为
#define assert(ignore) ((void)0)
根据NDEBUG的当前状态重新定义assert宏 每次包含 。
【讨论】:
好吧,我想知道assertions are checked在调试方面是什么意思 @Kaiyakha 你的问题没有意义。很明显,这意味着当宏 NDEBUG 没有定义时,所有的断言都会被检查。否则它们将被忽略。 @我更新了问题,希望这能解决问题 @Kaiyakha 我已经回答了你的问题。【参考方案2】:我相信你混合了导致混乱的两件事。
当您听说调试时,您可能正在考虑使用断点等单步执行程序。Assert 和 NDEBUG(直接)与此没有任何关系。
另一个问题是程序是否使用调试配置编译。这意味着编译器没有或有限的优化、添加的调试符号、激活的断言以及可能更多的东西。为了在发布配置中禁用断言,定义了 NDEBUG,它会为失败的断言停用崩溃。
为了正确进行调试,您应该使用使用调试配置编译的应用程序版本。这通常也会导致失败的断言触发您的调试器。但是这样的版本还有其他用途。例如,您可以将其提供给测试人员,以便在发生意外情况时触发断言。
【讨论】:
以上是关于断言与 C/C++ 中的调试有啥关系? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章