5

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

我按照stackoverflow中的建议尝试了marco,但它不起作用。我正在使用 Visual Studio 2012(空项目 C++)

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

5 回答 5

13

#if DEBUG仅当您DEBUG通过编译器选项定义时才有效。

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

于 2013-04-22T08:38:28.620 回答
1

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

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

在任何情况下,您都可以在 Visual Studio 中定义自己的宏

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

于 2013-04-22T08:39:24.963 回答
0

从您的评论看来,您遇到的问题似乎是打开并连接了一个控制台窗口stdout(与 DEBUG 与 RELEASE 构建几乎没有关系)。

请参阅 MS 支持文章信息:从 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()调用以避免缓冲问题。

于 2013-04-22T09:04:14.027 回答
0

这是针对 Visual Studio 2019 的:

#ifdef _DEBUG
// do something in a debug build
#else
// do something in a release build
#endif
于 2020-11-17T20:09:29.460 回答
-1

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

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

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

#if DEBUG

// debug mode

#else

//release mode

#endif
于 2014-03-14T05:53:25.983 回答