我正在完成我的学校作业。在调试模式下,我想打开控制台模式,在发布模式下关闭控制台。
我已经尝试了stackoverflow上推荐的宏,但它没有起作用。我正在使用Visual Studio 2012(空项目C ++)。
#if DEBUG
//doing something
#else
//Release mode doing something
#endif
我正在完成我的学校作业。在调试模式下,我想打开控制台模式,在发布模式下关闭控制台。
我已经尝试了stackoverflow上推荐的宏,但它没有起作用。我正在使用Visual Studio 2012(空项目C ++)。
#if DEBUG
//doing something
#else
//Release mode doing something
#endif
#if DEBUG
只有在你通过编译器选项定义了DEBUG
才能工作。
默认情况下,DEBUG
未定义,但_DEBUG
被定义。尝试使用#if defined(_DEBUG)
,或更改编译器选项(通过项目属性/配置属性/C++/预处理器/预处理器定义)来定义DEBUG
。
#if
上吗?试着在#if
和#else
块中加入一个#error
,看看编译器输出的内容。 - RichieHindle#if defined(DEBUG) | defined(_DEBUG)
需要双竖线:#if defined(DEBUG) || defined(_DEBUG)
。 - RichieHindle#if DEBUG
会在编译时而非运行时解决。
NDEBUG
是在发布模式下定义的标准宏。我认为在调试模式下,Visual Studio会定义_DEBUG
宏。
无论如何,您都可以在Visual Studio中定义自己的宏。
转到项目->属性->配置属性->C/C++->预处理器 -> 预处理器定义
,在您选择的构建配置中添加项目的宏。
stdout
的控制台窗口(与DEBUG vs. RELEASE构建关系不大)。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()
调用。这是针对Visual Studio 2019的:
#ifdef _DEBUG
// do something in a debug build
#else
// do something in a release build
#endif
对于C#,常量DEBUG可以正常工作,只需确保在项目属性中启用它。
进入项目属性(通过在解决方案资源管理器中右键单击项目),然后选择窗口右侧的构建选项并选中定义DEBUG常量复选框。
然后您就可以使用类似以下的代码。
#if DEBUG
// debug mode
#else
//release mode
#endif