"NDEBUG"预处理宏在不同平台上用于什么?

42

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

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

我想要包含特定答案,其中你知道某个C或C++的平台/框架/库使用NDEBUG定义来启用或禁用除了标准定义的assert()之外的任何内容

提出这个问题的原因之一是因为MS(Visual-C++)始终(?)使用他们自己的_DEBUG定义来区分调试和发布的代码。我想知道这是否是库/平台具有自己的调试定义的常见做法,或者其他库/平台是否使用NDEBUG来处理与调试相关的内容。


MSDN页面的链接已经失效。存档网址:https://web.archive.org/web/20110412105153/http://msdn.microsoft.com/en-us/library/0b98s6w8(v=vs.80).aspx - AJM
2个回答

34
NDEBUG 的唯一“标准”是它用于控制 assert 宏是否会展开成执行检查的语句。在发布版构建中,MSVC 会自动为您定义该宏,以便控制断言检查的开启和关闭。您可以通过手动编辑项目配置来更改该宏的状态。其他工具链可能会(也可能不会)做类似的事情。
请注意,您还可以使用 #define 和/或 #undefNDEBUG 进行重新定义和取消定义,并重新包含 assert.h ,以在源文件中更改 assert 宏的行为(开启和关闭)。这种行为是由标准规定的,也是我所知道的唯一允许在第二次包含标准头文件后更改编译行为的情况。

1
谢谢。这是一个有用的澄清。然而,它并没有回答是否/如何被一些平台/库用于其他用途。(我认为在MSVC中它不会被用于除了assert()之外的任何其他用途,但我甚至都不确定。) - Martin Ba

29

这是取决于所涉及框架的维护者们的决定。由于这样的决定可能会发生变化,你不应该依赖它。我使用NDEBUG作为所有与调试相关的开关(例如跟踪输出),但在下一个版本中我可能会改变我的想法。这里任何人所能给出的答案都不能替代检查你在给定项目中使用的框架的API文档。

话虽如此,如果在库/框架头文件中使用NDEBUG来处理除了assert()之外的任何内容,那将是一个相当愚蠢的设计决策。应用程序员可以在包含任何库或框架的头文件之前或之后显式地设置/取消NDEBUG,因此库/框架的维护者不能依赖于NDEBUG被设置为发布库或未设置为调试库。我怀疑任何重要的项目都不会以这种方式依赖于NDEBUG。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接