首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么是NDEBUG而不是发布?

为什么是NDEBUG而不是发布?
EN

Stack Overflow用户
提问于 2012-02-10 23:16:13
回答 4查看 8.7K关注 0票数 13

当定义宏NDEBUG时,标准C assert宏将被禁用,这意味着“非调试”。这导致了非常可怕的双重否定案例,比如#ifndef NDEBUG //DebuggingCode #endif。发布似乎是一个更好的术语选择,但我不敢相信标准委员会会在没有任何理由的情况下这样做……

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-10 23:22:14

有一个宏发布意味着代码已经准备好分发了--虽然它可能还没有。另一方面,NDEBUG意味着调试已经完成,因此可以进行测试了。

我还认为,不得不关闭所有东西比必须确保一切都打开要好得多。这就是为什么大多数操作系统(例如)在很多人不需要的时候打开了大多数东西。

只是我谦虚的想法。

票数 6
EN

Stack Overflow用户

发布于 2012-02-10 23:29:30

NDEBUG控制assert的行为方式。

通常情况下,您不应该将其用于任何其他用途。如果您希望将其用于其他用途,如额外的调试跟踪输出,那么您就没有选择在没有额外代码的情况下构建应用程序,而是启用了断言。

我建议您定义自己的预处理器符号,比如MY_TRACE,并使用它。另外,将其定义为01并使用#if MY_TRACE。这样,如果将编译器配置为在预处理器表达式中使用未初始化的变量时发出警告,则可以在未正确初始化的情况下捕获使用该符号的文件。

票数 7
EN

Stack Overflow用户

发布于 2012-02-11 16:17:34

我不敢相信标准委员会会在没有任何理由的情况下选择使用NDEBUG这个名字来控制assert()……

我只能猜测,但我怀疑在标准之前,不同的实现可能使用了几个不同的名称来控制断言宏的工作方式,委员会可能决定选择一个“中立”的名称,因为一些不相关的原因,这个名称不太可能在现有代码中使用。我认为在相当一部分代码中使用RELEASE作为宏可能是相当常见的,因此使用该名称(或DEBUG)来控制assert()宏可能会导致冲突(特别是对于那些可能想要对断言进行精细控制的用户,只对代码的某些部分启用它们)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9229978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档