_DEBUG 与 NDEBUG

新手上路,请多包涵

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

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

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

原文由 deft_code 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

Visual Studio 定义 _DEBUG 当您指定 /MTd/MDd 选项时, NDEBUG 禁用断言。在适当的时候使用它们,即 _DEBUG 如果您希望您的调试代码与 MS CRT 调试技术 一致,而 NDEBUG 如果您希望与 assert() .

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

原文由 Christoph 发布,翻译遵循 CC BY-SA 4.0 许可协议

NDEBUG 标准吗?

是的,它是一个标准宏,具有 C89、C99、C++98、C++2003、C++2011、C++2014 标准的语义“非调试”。标准中没有 _DEBUG 宏。

C++2003 标准将阅读器在“17.4.2.1 标题”的“第 326 页”发送到标准 C。

那 NDEBUG 类似于 This is the same as the Standard C library。

在 C89(C 程序员将此标准称为标准 C)中的“4.2 诊断”部分中说

https://port70.net/~nsz/c/c89/c89-draft.html

如果在源文件中包含 的位置将 NDEBUG 定义为宏名称,则断言宏定义为

     #define assert(ignore) ((void)0)

如果在 Visual Studio https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros 中查看 _DEBUG 宏的含义,就会发现,这个宏是自动定义的由您选择的语言运行时库版本。

原文由 Konstantin Burlachenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题