应该使用哪个预处理器定义来指定代码的调试部分?
使用 #ifdef _DEBUG
或 #ifndef NDEBUG
或者有更好的方法,例如 #define MY_DEBUG
?
我认为 _DEBUG
是 Visual Studio 特有的,是 NDEBUG 标准吗?
原文由 deft_code 发布,翻译遵循 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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
Visual Studio 定义
_DEBUG
当您指定/MTd
或/MDd
选项时,NDEBUG
禁用断言。在适当的时候使用它们,即_DEBUG
如果您希望您的调试代码与 MS CRT 调试技术 一致,而NDEBUG
如果您希望与assert()
.如果您定义自己的调试宏(并且您没有破解编译器或 C 运行时),请避免以下划线开头的名称,因为这些是保留的。