为什么NDEBUG而不是RELEASE?

Bil*_*eal 11 c assert c-preprocessor

NDEBUG定义宏时禁用标准C断言宏,意味着"不调试".这导致了非常糟糕的双重否定案例#ifndef NDEBUG //DebuggingCode #endif.似乎RELEASE本来是一个更好的术语选择,但我无法相信标准委员会会这样做而没有任何理由这样做....

Lin*_*cer 7

NDEBUG控制assert行为方式.

您通常不应该将它用于其他任何事情.如果您将其用于其他事情,例如额外的调试跟踪输出,则您没有选项来构建应用程序而没有这些额外的代码但启用了断言.

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

  • 好吧,如果你不使用它来控制`assert`,你永远不需要写`#ifndef NDEBUG`. (4认同)
  • 为什么它不是'NASSERT`那么......?`NDEBUG`对我说"没有调试".恕我直言`NDEBUG`应涵盖您的应用程序中的所有调试输出.然后你可以使用额外的宏,如果你想**打开**somethig special.定义"1000"非标准宏以摆脱自定义调试级别看起来不方便...... (3认同)
  • 当你需要让`assert`s能够跟踪一个罕见的难以重现的bug时,会发生什么呢?但是不希望在整个地方喷出数千行调试输出? (2认同)

Ed *_*eal 5

拥有一个宏RELEASE意味着代码已准备好分发 - 当它可能没有时.另一方面,NDEBUG意味着调试已完成,因此可以进行测试.

我还认为不得不关闭事情比确保你已经完成所有事情更好.这就是为什么大多数操作系统(例如)在很多人不需要的时候开启大部分操作系统的原因.

只是我谦虚的想法.