我对各种平台/编译器(“实现”)/框架分配给 C 和C ++预处理器宏NDEBUG
的目的感兴趣。
C 以及C ++标准只提到一次这个定义,即控制assert()
宏的行为。
我会要求只包含具体答案,您知道 C 或C ++的某个平台/框架/库使用NDEBUG
定义除标准定义的assert()
宏外,启用或停用其他任何。
提出这个问题的一个原因是MS(Visual-C ++)总是(?)使用“他们的”_DEBUG
定义来区分调试和发布的东西,我想知道这是否是一种常见的做法一个库/平台,用于“自己的”调试定义,或者其他库/平台是否使用NDEBUG
作为调试相关的东西。
答案 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。