在Visual Studio中,根据Debug/Release配置自动定义#define。

52

我在程序中有这样的调试输出:

#define DEBUG
...
#ifdef DEBUG
    std::cout << "[RE_words] " << m_re << std::endl;
#endif

我手动在程序中定义了DEBUG,发布版本时我总是将该行注释掉。在Visual Studio中,还有针对DebugRelease版本的配置,它们处理用于编译的命令行等内容。我能否使用"Debug"配置来自动向编译器定义DEBUG?如何操作?

4个回答

92
Visual Studio 会自动为 Debug 构建定义 _DEBUG 符号(对于非 Debug 构建,则定义 NDEBUG 符号)。
另一种方法是进入项目设置 -> 配置属性 -> C/C++ -> 预处理器,手动编辑预处理器定义。
参见: 此答案更详细地解释了 _DEBUG 和 NDEBUG 的区别。 此答案解释了 NDEBUG 符号的目的以及它是否被标准所定义。

8
顺便提一下,NDEBUG是一个可移植的解决方案。有点不幸的是,没有为调试构建存在标准符号。 - edA-qa mort-ora-y
你好,你怎么确定vs定义了那些宏?在msdn上只提到了_DEBUG,没有提到NDEBUG,请问我在哪里可以看到VS为您提供的所有宏列表? - Icebone1000
@Icebone1000:我已经添加了一个链接,解释了NDEBUG是否是标准符号以及为什么会被认为是可移植的。请参见VS中的预定义宏列表。list of predefined macros - Jan Holecek
请注意,如果您手动编辑定义,则可能需要在它们被识别之前重新启动VS。 - RoG

11

使用_DEBUG。Visual C++会为Debug配置定义此常量。在项目属性对话框中查看Debug配置的预处理器指令。


5

我之前也认为只要查看预处理器属性并删除_DEBUG就可以了。但是,如果您选择调试运行时库选项之一,Visual Studio会设置_DEBUG以帮助您。

在项目属性页面配置属性\C/C++\代码生成中,对于运行时库选择的选项会影响多个定义。当选择调试库(/MTd/MDd)时,_DEBUG定义被设置

有关这些开关的更多信息,请参见MSDN /MD、/MT...。根据这些选项设置了几个#define,当您尝试查找在包括任何头文件之前谁设置了#define时,它们通常是相当隐形的!


0

是的,您应该检查项目选项页面,编译 ->高级编译选项。 但是,VS默认情况下会自动为调试模式定义DEBUG指令。


2
我相信这是_DEBUG指令。请注意下划线。 - notbad.jpeg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接