【问题标题】:Runtime how to determine Debug or release mode in visual studio c++运行时如何确定 Visual Studio C++ 中的调试或发布模式
【发布时间】:2013-04-15 02:01:41
【问题描述】:

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

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

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

【问题讨论】:

  • 怎么不工作了?您是否收到编译时错误?它对发布或调试版本做同样的事情吗?什么?
  • 不知道为什么。在我的 DEBUG 中包含 if(AllocConsole()) freopen("CONOUT$", "w", stdout);
  • 我没有任何编译时错误。我必须在可视项目中设置任何属性吗?

标签: c++ debugging visual-studio-2012 macros release


【解决方案1】:

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

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

【讨论】:

  • 嗨,我已经尝试定义(_DEBUG),但它仍然无法正常工作。 #如果定义(调试)|定义(_DEBUG)
  • 你能解释一下关于配置属性的细节吗?我试着把 DEBUG 不行
  • 我能想到的是 DEBUG= 1;在配置属性下。不确定是正确的方法
  • @user2306421:仍然不清楚您的问题出在哪里 - 您是否 100% 确定问题出在 #if 上?尝试将#error 放在#if#else 块中,看看你从编译器得到什么输出。
  • @user2306421:#if defined(DEBUG) | defined(_DEBUG) 需要双栏:#if defined(DEBUG) || defined(_DEBUG)
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    有关如何让 GUI 程序打开控制台并将 stdout 指向它的工作示例,请参阅 MS 支持文章 INFO: Calling CRT Output Routines from a GUI Application

    #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 告诉我缓冲区问题。
    【解决方案4】:

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

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

    那么你就可以使用这样的代码了。

    #if DEBUG
    
    // debug mode
    
    #else
    
    //release mode
    
    #endif
    

    【讨论】:

    • c# 是从哪里来的?
    【解决方案5】:

    这是针对 Visual Studio 2019 的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多