39

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

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

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

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

4

2 回答 2

28

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

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

于 2011-03-29T14:37:04.680 回答
24

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

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

于 2011-03-29T16:24:23.610 回答