2013-04-22 66 views
3

我正在做我的学校作业。在调试模式下,我想打开我的控制台模式,并在发布期间关闭控制台。运行时间如何确定Visual Studio中的调试或发布模式C++

我有尝试marco按照推荐在stackoverflow但它不工作。我使用的Visual Studio 2012(空项目C++)

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

它是如何工作的?你是否收到编译时错误?它是否对发布版本或调试版本做同样的事情?什么? – 2013-04-22 08:28:16

+0

不知道为什么。在我的DEBUG里面包含了if(AllocConsole()) freopen(“CONOUT $”,“w”,stdout); – user2306421 2013-04-22 08:30:12

+0

我没有任何编译时错误。我是否必须在可视化项目中设置任何属性? – user2306421 2013-04-22 08:35:30

回答

9

#if DEBUG如果通过编译器选项定义DEBUG才会工作。

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

+0

嗨,我试过定义(_DEBUG),但它仍然无法正常工作。 #if defined(DEBUG)|定义(_DEBUG) – user2306421 2013-04-22 10:19:02

+0

您能否解释一些关于配置属性的细节?我试图让DEBUG不会工作 – user2306421 2013-04-22 10:20:15

+0

我能想到的是DEBUG = 1;在配置属性下。不知道是否正确的做法 – user2306421 2013-04-22 10:26:52

0

#if DEBUG将在编译时自行解析,而不是在运行时解析。

NDEBUG是在发布模式下定义的非常标准的宏。 而我认为Visual Studio在调试模式下定义了_DEBUG宏。

在任何情况下,你可以在Visual Studio

转到Project->Properties->Configuration Properties->C/C++->Preprocessor -> Preprocessor Definitions定义自己的宏在那里,你可以在你所选择的构建配置项目中添加宏。

0

从你的意见看来,你遇到的问题是获得一个控制台窗口打开并连接到stdout(与DEBUG与RELEASE构建没有多大关系)。

查看MS支持文章INFO: Calling CRT Output Routines from a GUI Application为如何有一个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()以避免缓冲问题。

+0

感谢MichaelBurr告诉我缓冲区问题。 – user2306421 2013-04-23 03:32:29

-1

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

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

然后你可以使用这样的代码。

#if DEBUG 

// debug mode 

#else 

//release mode 

#endif 
+1

c#在哪里? – marsh 2016-09-13 17:18:06

相关问题