我正在尝试在主应用程序窗口旁边运行一个控制台窗口,显然这应该可以工作,实际上控制台窗口会显示但是以'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);
这对我不起作用,所以我错过了什么?
答案 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);
由于上述原因,这将无法成功编译。我得到的错误与您的错误类似。