应该使用哪个预处理器定义来指定代码的调试部分?
使用#ifdef _DEBUG
或#ifndef NDEBUG
,或者有更好的方法,例如#define MY_DEBUG
我认为_DEBUG
是Visual Studio特有的,NDEBUG是标准的吗?
发布于 2010-02-19 01:12:59
Visual Studio定义标准当您指定/MTd
或/MDd
选项时,NDEBUG
将禁用标准C断言。在适当的时候使用它们,例如,如果你想让你的调试代码与MS CRT debugging techniques保持一致,就使用_DEBUG
;如果你想让你的调试代码与NDEBUG
保持一致,就使用assert()
。
如果您定义了自己的调试宏(并且不破解编译器或C运行时),请避免以下划线开头的名称,因为它们是保留的。
发布于 2013-06-22 01:42:18
我依赖NDEBUG
,因为它是唯一一个其行为在编译器和实现之间都是标准化的(请参阅标准assert宏的文档)。负逻辑是一个小的可读性加速,但它是一个常见的习惯用法,你可以很快适应。
依赖于像_DEBUG
这样的东西就是依赖于特定编译器和库实现的实现细节。其他编译器可能会也可能不会选择相同的约定。
第三种选择是为您的项目定义自己的宏,这是非常合理的。拥有自己的宏为您提供了跨实现的可移植性,并允许您独立于断言启用或禁用调试代码。不过,一般来说,我建议不要在编译时启用不同类别的调试信息,因为这会增加您必须构建(和测试)的配置数量,但好处可能很小。
对于这些选项中的任何一个,如果您使用第三方代码作为项目的一部分,您必须知道它使用的是哪种约定。
发布于 2010-02-19 03:35:50
宏NDEBUG
控制assert()
语句是否处于活动状态。
在我看来,这与任何其他调试是分开的-所以我使用NDEBUG
之外的其他东西来控制程序中的调试信息。我使用的不同,取决于我使用的框架;不同的系统有不同的启用宏,我使用任何合适的。
如果没有框架,我会使用没有前导下划线的名称;这些下划线倾向于保留给“实现”,并且我试图避免名称冲突的问题-当名称是宏时更是如此。
https://stackoverflow.com/questions/2290509
复制相似问题