_DEBUG与NDEBUG?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

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

使用#ifdef _DEBUG#ifndef NDEBUG有没有更好的方法来做到这一点,例如#define MY_DEBUG

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

提问于
用户回答回答于

Visual Studio _DEBUG在你指定/MTd/MDd选项时定义,NDEBUG禁用标准C断言。适当时使用它们,例如,_DEBUG如果你希望您的调试代码与MS CRT调试技术保持一致,并且NDEBUG你希望与之保持一致assert()

如果你定义了你自己的调试宏(并且你没有破解编译器或者C运行时),那么避免用下划线开始名字,因为它们是保留的。

用户回答回答于

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

依赖于类似的东西_DEBUG将依赖于特定编译器和库实现的实现细节。其他编译器可能会或可能不会选择相同的约定。

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

使用这些选项中的任何一个,如果您将第三方代码用作项目的一部分,则必须注意其使用的约定。

扫码关注云+社区