定义宏NDEBUG
时禁用标准C断言宏,意味着“不调试”。这导致了非常糟糕的双重否定案例,如#ifndef NDEBUG //DebuggingCode #endif
。似乎RELEASE本来是一个更好的术语选择,但我无法相信标准委员会会这样做而没有任何理由这样做....
答案 0 :(得分:6)
宏NDEBUG
控制assert
的行为方式。
您通常不应将其用于其他任何事情。如果你将它用于其他事情,比如额外的调试跟踪输出,你就没有选择在没有这些额外代码但是启用了断言的情况下构建应用程序。
我建议您定义自己的预处理器符号,比如MY_TRACE,并使用它。另外,将其定义为0
或1
并使用#if MY_TRACE
。这样,如果将编译器配置为在预处理器表达式中使用未初始化的变量时发出警告,则可以使用符号捕获文件而不进行正确初始化。
答案 1 :(得分:5)
拥有一个宏RELEASE意味着代码已准备好分发 - 当它可能没有时。另一方面,NDEBUG意味着调试已经完成,因此可以进行测试。
我还认为不得不关闭事情比确保你已经完成所有事情更好。这就是为什么大多数操作系统(例如)在很多人不需要的时候开启大部分操作系统的原因。
只是我谦虚的想法。
答案 2 :(得分:3)
我无法相信标准委员会会[没有理由选择使用NDEBUG这个名称来控制
assert()
] ....
我只能猜测,但我怀疑预先标准可能已经有各种不同的名称用来控制断言宏如何工作,委员会可能决定选择一个“中性”名称,这个名称不太可能因某些无关的原因而在现有代码中使用。我认为RELEASE
在相当多的代码中用作宏可能相当普遍,因此使用该名称(或DEBUG
)来控制assert()
宏可能会导致冲突(特别是对于那些可能希望对断言进行精细控制的用户,仅针对部分代码打开它们)。
答案 3 :(得分:0)
作为长期的Eiffel用户,我可以告诉你它以不同的方式使用,然后调试/ nodebug。正如所指出的,唯一的影响是禁用断言语句。 assert的目的是添加前后条件检查。建议大量使用它,它可以使程序的性能降低10倍或更多。这被称为(穷人)合同设计。
当使用NDEBUG时,它并不意味着你完成了调试,只是它已经删除了这个繁重的调试工具。
不幸的是,流行的调试/发布不是实际开发中的最佳案例,因为有充分的理由你有一个Alpha,Beta,Release版本。
在alpha软件中,如果没有NDEBUG和调试器符号就可以编译它。 Beta使用NDEBUG集合和调试器符号进行编译(可能已经使用优化开关),然后使用NDEBUG和完全优化编译最终版本。