首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >_DEBUG vs NDEBUG

_DEBUG vs NDEBUG
EN

Stack Overflow用户
提问于 2010-02-19 00:59:38
回答 5查看 168.9K关注 0票数 159

应该使用哪个预处理器定义来指定代码的调试部分?

使用#ifdef _DEBUG#ifndef NDEBUG,或者有更好的方法,例如#define MY_DEBUG

我认为_DEBUG是Visual Studio特有的,NDEBUG是标准的吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-19 01:12:59

Visual Studio定义标准当您指定/MTd/MDd选项时,NDEBUG将禁用标准C断言。在适当的时候使用它们,例如,如果你想让你的调试代码与MS CRT debugging techniques保持一致,就使用_DEBUG;如果你想让你的调试代码与NDEBUG保持一致,就使用assert()

如果您定义了自己的调试宏(并且不破解编译器或C运行时),请避免以下划线开头的名称,因为它们是保留的。

票数 126
EN

Stack Overflow用户

发布于 2013-06-22 01:42:18

我依赖NDEBUG,因为它是唯一一个其行为在编译器和实现之间都是标准化的(请参阅标准assert宏的文档)。负逻辑是一个小的可读性加速,但它是一个常见的习惯用法,你可以很快适应。

依赖于像_DEBUG这样的东西就是依赖于特定编译器和库实现的实现细节。其他编译器可能会也可能不会选择相同的约定。

第三种选择是为您的项目定义自己的宏,这是非常合理的。拥有自己的宏为您提供了跨实现的可移植性,并允许您独立于断言启用或禁用调试代码。不过,一般来说,我建议不要在编译时启用不同类别的调试信息,因为这会增加您必须构建(和测试)的配置数量,但好处可能很小。

对于这些选项中的任何一个,如果您使用第三方代码作为项目的一部分,您必须知道它使用的是哪种约定。

票数 54
EN

Stack Overflow用户

发布于 2010-02-19 03:35:50

NDEBUG控制assert()语句是否处于活动状态。

在我看来,这与任何其他调试是分开的-所以我使用NDEBUG之外的其他东西来控制程序中的调试信息。我使用的不同,取决于我使用的框架;不同的系统有不同的启用宏,我使用任何合适的。

如果没有框架,我会使用没有前导下划线的名称;这些下划线倾向于保留给“实现”,并且我试图避免名称冲突的问题-当名称是宏时更是如此。

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

https://stackoverflow.com/questions/2290509

复制
相关文章

相似问题

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