在Visual Studio C++中如何确定运行模式是调试或发布模式

5

我正在完成我的学校作业。在调试模式下,我想打开控制台模式,在发布模式下关闭控制台。

我已经尝试了stackoverflow上推荐的宏,但它没有起作用。我正在使用Visual Studio 2012(空项目C ++)。

#if DEBUG
 //doing something
#else
 //Release mode doing something
#endif

它为什么不工作?你是否收到编译时错误?它在发布版或调试版中都是一样的吗?什么情况? - Michael Burr
不确定为什么。在我的DEBUG中,包括以下内容:if(AllocConsole()) freopen("CONOUT$", "w", stdout); - user2306421
我没有任何编译时错误。我需要在Visual项目中设置任何属性或其他东西吗? - user2306421
5个回答

14

#if DEBUG 只有在你通过编译器选项定义了DEBUG才能工作。

默认情况下,DEBUG未定义,但_DEBUG被定义。尝试使用#if defined(_DEBUG),或更改编译器选项(通过项目属性/配置属性/C++/预处理器/预处理器定义)来定义DEBUG


嗨,我已经尝试使用defined(_DEBUG),但它仍然无法工作。#if defined(DEBUG) | defined(_DEBUG) - user2306421
你能详细解释一下配置属性吗?我尝试设置DEBUG,但它不起作用。 - user2306421
我能想到的是在配置属性下设置DEBUG=1;不确定这是否是正确的方法。 - user2306421
@user2306421:你的问题仍然不是很清楚——你确定问题百分之百出在#if上吗?试着在#if#else块中加入一个#error,看看编译器输出的内容。 - RichieHindle
@user2306421: #if defined(DEBUG) | defined(_DEBUG) 需要双竖线:#if defined(DEBUG) || defined(_DEBUG) - RichieHindle

1

#if DEBUG会在编译时而非运行时解决。

NDEBUG是在发布模式下定义的标准宏。我认为在调试模式下,Visual Studio会定义_DEBUG宏。

无论如何,您都可以在Visual Studio中定义自己的宏。

转到项目->属性->配置属性->C/C++->预处理器 -> 预处理器定义,在您选择的构建配置中添加项目的宏。


0
从您的评论中看来,您遇到的问题是打开并连接到stdout的控制台窗口(与DEBUG vs. RELEASE构建关系不大)。
请参阅MS支持文章INFO:从GUI应用程序调用CRT输出例程,了解如何让GUI程序打开控制台并将stdout定向到其中的工作示例:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

// ...

int hCrt;
FILE *hf;

AllocConsole();
hCrt = _open_osfhandle(
    (long) GetStdHandle(STD_OUTPUT_HANDLE),
    _O_TEXT
    );
hf = _fdopen( hCrt, "w" );
*stdout = *hf;
int i = setvbuf( stdout, NULL, _IONBF, 0 );
puts("hello world");

实际上,在进一步测试中,你使用freopen("CONOUT$","w",stdout);的简单技巧也可以起作用。奇怪的是,在我最初的测试中,它似乎没有起作用。为了避免缓冲问题,你可能还需要使用setvbuf()调用。

感谢MichaelBurr告诉我有关缓冲区问题的信息。 - user2306421

0

这是针对Visual Studio 2019的:

#ifdef _DEBUG
// do something in a debug build
#else
// do something in a release build
#endif

-1

对于C#,常量DEBUG可以正常工作,只需确保在项目属性中启用它。

进入项目属性(通过在解决方案资源管理器中右键单击项目),然后选择窗口右侧的构建选项并选中定义DEBUG常量复选框。

然后您就可以使用类似以下的代码。

#if DEBUG

// debug mode

#else

//release mode

#endif

1
C# 在这里扮演什么角色? - marsh

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