应该使用哪个预处理器定义来指定代码的调试部分?
使用#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运行时),请避免以下划线开头的名称,因为它们是保留的。
发布于 2015-03-25 18:36:58
是NDEBUG标准吗?
是的,它是针对C89、C99、C++98、C++2003、C++2011、C++2014标准的具有“非调试”语义的标准宏。标准中没有_DEBUG宏。
C++2003标准将“第326页”的"17.4.2.1标题“处的读卡器发送到标准C。
表示NDEBUG类似于标准C库。
在C89 (C程序员将此标准称为标准C)中,在"4.2诊断“部分中说
http://port70.net/~nsz/c/c89/c89-draft.html
如果在源文件中包含的位置将NDEBUG定义为宏名称,则assert宏将简单定义为
#定义断言(忽略) ((void)0)
如果看看Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx中_DEBUG宏的含义,就会发现这个宏是由您的с语言运行时库版本自动定义的。
发布于 2013-06-22 01:42:18
我依赖NDEBUG,因为它是唯一一个其行为在编译器和实现之间都是标准化的(请参阅标准assert宏的文档)。负逻辑是一个小的可读性加速,但它是一个常见的习惯用法,你可以很快适应。
依赖于像_DEBUG这样的东西就是依赖于特定编译器和库实现的实现细节。其他编译器可能会也可能不会选择相同的约定。
第三种选择是为您的项目定义自己的宏,这是非常合理的。拥有自己的宏为您提供了跨实现的可移植性,并允许您独立于断言启用或禁用调试代码。不过,一般来说,我建议不要在编译时启用不同类别的调试信息,因为这会增加您必须构建(和测试)的配置数量,但好处可能很小。
对于这些选项中的任何一个,如果您使用第三方代码作为项目的一部分,您必须知道它使用的是哪种约定。
https://stackoverflow.com/questions/2290509
复制相似问题