AllocConsole与Visual Studio 2013

时间:2015-02-22 01:13:14

标签: c++ visual-studio-2013

我正在尝试在主应用程序窗口旁边运行一个控制台窗口,显然这应该可以工作,实际上控制台窗口会显示但是以'freopen'开头的3行代码会停止编译,例如“丢失”类型说明符“。

 #include <stdio.h>
 #include "Windows.h"
 #include "Wincon.h"

 BOOL f = AllocConsole();
 freopen("CONIN$", "r", stdin);
 freopen("CONOUT$", "w", stdout);
 freopen("CONOUT$", "w", stderr);

删除3行并将其替换为:

 OutputDebugString(L"\n");

我认为应该用来设置窗口中的文本会出现以下错误:

 1>main.cpp(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
 1>main.cpp(13): error C2365: 'OutputDebugStringW' : redefinition; previous definition was 'function'
 1>          C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\winbase.h(7733) : see declaration of 'OutputDebugStringW'
 1>main.cpp(13): error C2440: 'initializing' : cannot convert from 'const wchar_t [2]' to 'int'
 1>          There is no context in which this conversion is possible

寻找答案可以得到很多结果,但他们通常会说:

AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);

这对我不起作用,所以我错过了什么?

2 个答案:

答案 0 :(得分:0)

我个人在需要控制台和gui的程序中使用它。你可以尝试一下,看看它是否适合你......它使用iostream代替freopen

它没有回答你的问题,但这是实现同一目标的想法或其他方式。

#include <iostream>
#include <windows.h>
#include <fstream>
#include <streambuf>

class Console
{
    private:
        std::wstreambuf *CinBuffer, *CoutBuffer, *CerrBuffer;
        std::wfstream ConsoleInput, ConsoleOutput, ConsoleError;

    public:
        Console();
        Console(const Console &console) = delete;
        Console(Console&& console); = delete;
        ~Console();

        Console& operator = (const Console& other) = delete;
        Console& operator = (Console&& other) = delete;

        template<typename T>
        void operator << (const T &Data) {std::wcout<<Data<<std::flush;}
};


Console::Console()
{
    if (AllocConsole())
    {
        CinBuffer = std::wcin.rdbuf();
        CoutBuffer = std::wcout.rdbuf();
        CerrBuffer = std::wcerr.rdbuf();
        ConsoleInput.open("CONIN$", std::ios::in);
        ConsoleOutput.open("CONOUT$", std::ios::out);
        ConsoleError.open("CONOUT$", std::ios::out);
        std::wcin.rdbuf(ConsoleInput.rdbuf());
        std::wcout.rdbuf(ConsoleOutput.rdbuf());
        std::wcerr.rdbuf(ConsoleError.rdbuf());
    }
}

Console::~Console()
{
    ConsoleInput.close();
    ConsoleOutput.close();
    ConsoleError.close();
    std::wcin.rdbuf(CinBuffer);
    std::wcout.rdbuf(CoutBuffer);
    std::wcerr.rdbuf(CerrBuffer);
    FreeConsole();
}

答案 1 :(得分:0)

我会尝试通过发布您已发布的代码来回答您的问题,但添加相应的#include文件。

#include <windows.h>
#include <cstdio>

int main()
{
    BOOL f = AllocConsole();
    freopen("CONIN$", "r", stdin);
    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
}

使用Visual Studio 2013,有关于&#34;危险功能&#34;的警告,但代码编译成功。因此,您应该使用 as-is 上面的代码并进行编译。如果有错误,请更新您的问题。


编辑:由于您更新了问题,我可以看到这些错误的唯一原因是因为该代码必须位于功能块内。你不能像这样独立地拥有可执行的代码行。

这实质上就是你发布的内容:

#include <windows.h>
#include <cstdio>

BOOL f = AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);

由于上述原因,这将无法成功编译。我得到的错误与您的错误类似。