【问题标题】:What is the NDEBUG preprocessor macro used for (on different platforms)?NDEBUG 预处理器宏用于(在不同平台上)是什么?
【发布时间】:2011-07-25 07:39:03
【问题描述】:

我对各种平台/编译器(“实现”)/框架分配给 C 和 C++ 预处理器宏 NDEBUG 的用途感兴趣。

C以及C++标准只提到了一次这个定义,即控制assert()宏的行为。

我会要求只包含具体的答案,您知道 C 或 C++ 的某个平台/框架/库使用NDEBUG 定义来启用或禁用除了标准定义的assert()之外的任何其他内容。

问这个问题的一个原因是 MS(Visual-C++)总是(?)使用“他们的”_DEBUG 定义来区分调试和发布的东西,我想知道这是否是库的常见做法/platform 有他们“自己的”调试定义,或者其他库/平台是否使用NDEBUG进行调试相关的东西。

【问题讨论】:

    标签: c++ c cross-platform c-preprocessor ndebug


    【解决方案1】:

    NDEBUG 唯一的“标准”是它用于控制 assert 宏是否会扩展为执行检查的内容。 MSVC 通过在项目中为您定义此宏,有助于在发布构建配置中定义此宏。您可以通过编辑项目配置来手动更改它。其他工具链可能(也可能不会)做类似的事情。

    请注意,您还可以使用 #define 和/或 #undef on NDEBUG 更改翻译单元(源文件)中 NDEBUG 宏的状态,然后重新包含 assert.h 以更改assert 宏的行为(打开和关闭)。该行为是标准规定的,并且是唯一一次(我认为)该标准允许第二次包含标准标头以在第二次包含后更改编译行为。

    【讨论】:

    • 谢谢。这是一个有用的说明。但是,它不回答是否/是否被某些平台/库用于其他用途。 (我认为它在 MSVC 中没有用于其他任何东西(除了assert()),但我什至不确定这一点。)
    【解决方案2】:

    这是由相关框架的维护者决定的。由于此类决定可能会发生变化,因此您不应该依赖。我使用 NDEBUG 作为与调试相关的所有内容(例如跟踪输出)的切换,但我可能会在下一个版本中改变主意。没有人可以在这里给出的答案可以替代检查您在给定项目中使用的框架的 API 文档。

    话虽如此,在库/框架头文件中使用 NDEBUG,对于其他任何东西assert(),将是一个相当愚蠢的设计决定。应用程序程序员明确允许在包含任何库或框架的标头之前和/或之后设置/取消设置 NDEBUG,但他认为合适,因此 lib/框架维护者不能依赖设置的 NDEBUG用于发布库或未设置为调试库。我怀疑任何重要的项目都会以这种方式依赖 NDEBUG。

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 2013-09-11
      • 2015-10-04
      • 2020-04-07
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多