用于(在不同平台上)的NDEBUG预处理器宏是什么?

时间:2011-03-29 13:46:23

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

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

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

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

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

2 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:22)

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

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