【问题标题】: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 用于调试是什么?我们究竟要断言什么?为什么我们要避免这样的断言?

【问题讨论】:

标签: c++ c debugging assert


【解决方案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,它会为失败的断言停用崩溃。

为了正确进行调试,您应该使用使用调试配置编译的应用程序版本。这通常也会导致失败的断言触发您的调试器。但是这样的版本还有其他用途。例如,您可以将其提供给测试人员,以便在发生意外情况时触发断言。

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 2017-07-31
    • 2019-10-04
    • 2021-08-17
    • 2021-03-24
    • 2011-11-17
    • 2017-06-07
    • 2022-06-16
    相关资源
    最近更新 更多