在mingw:'上从WinAPI gui程序打开控制台_fdopen&x27;未在此范围中声明

在mingw:'上从WinAPI gui程序打开控制台_fdopen&x27;未在此范围中声明,winapi,mingw,console-application,Winapi,Mingw,Console Application,我目前正在MinGW下开发WinAPI Gui应用程序。在调试版本中,我想打开控制台并将stdin/stdout流重定向到它,以便可以看到在调试中打印的诊断消息。我跟随这篇文章: 它在Visual Studio下工作,但在MinGW上编译时,即使包含stdio.h,也会显示以下消息: error: '_fdopen' was not declared in this scope MinGW的论点: mingw32-g++.exe -march=pentium4 -std=c++11 -w -

我目前正在MinGW下开发WinAPI Gui应用程序。在调试版本中,我想打开控制台并将stdin/stdout流重定向到它,以便可以看到在调试中打印的诊断消息。我跟随这篇文章:

它在Visual Studio下工作,但在MinGW上编译时,即使包含stdio.h,也会显示以下消息:

error: '_fdopen' was not declared in this scope
MinGW的论点:

mingw32-g++.exe -march=pentium4 -std=c++11 -w -fpermissive -fno-strict-aliasing -D__STDC_CONSTANT_MACROS -D_WINDOWS -DUNICODE -D_UNICODE -g -D_DEBUG
我在谷歌上搜索了很多,这似乎是MinGW中的一个bug,如果使用C++11,则在头文件中没有定义_fdopen。由于我依赖于C++11功能,所以我无法关闭它,所以我正在寻找替代方案——有没有办法在Windows上打开控制台并重定向不依赖fdopen的stdin/stdout?如果没有,我的问题还有其他解决方案吗

我还试图手动声明
\u fdopen
(或
fdopen
),但它没有通过链接阶段


MinGW版本:4.7.1

根据一些简短的研究,我的理解是,您应该能够在GNU C++11中使用具有正确配置设置的
\u fdopen
/
fdopen
(即通过启用POSIX函数),但Windows实现中存在一个长期存在的缺陷。您是否可以直接解决这个问题可能取决于您使用的运行库

但是,根据场景的不同,还有其他各种可能的解决方法:

  • 在您的特定情况下,因为您是在构建时做出决定的,所以您可以简单地将调试版本构建为控制台应用程序,并让Windows来完成这项工作

  • 应该可以(同样,取决于运行库)配置构建,以便您的一些代码在运行库初始化之前运行;如果控制台已经存在,则运行库有望在初始化期间导入标准流

  • 您应该能够使用
    fopen
    打开
    CONIN$
    和/或
    CONOUT$
    以直接获取文件对象,而不是使用
    GetStdHandle
    获取Windows句柄。这可能是最普遍的解决方案


不确定在MinGW中如何实现这一点,但也许您可以编写一些初步代码,在运行库初始化之前运行?这样,您就可以使用SetStdHandle()。或者您可以简单地将调试版本构建为一个控制台应用程序?@HarryJohnston-最简单的解决方案确实是最好的解决方案:D将此作为答案,我很乐意接受!