C++ AllocSole与Visual Studio 2013
我试图在主应用程序窗口旁边运行一个控制台窗口,显然这应该可以工作,而且控制台窗口确实会显示,但是以“freopen”开头的3行代码会停止编译,并出现错误,例如“缺少类型说明符” 正如我认为应该用来设置窗口中的文本一样,会出现以下错误:C++ AllocSole与Visual Studio 2013,c++,visual-studio-2013,C++,Visual Studio 2013,我试图在主应用程序窗口旁边运行一个控制台窗口,显然这应该可以工作,而且控制台窗口确实会显示,但是以“freopen”开头的3行代码会停止编译,并出现错误,例如“缺少类型说明符” 正如我认为应该用来设置窗口中的文本一样,会出现以下错误: 1>main.cpp(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>main.cpp(13): er
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);
这对我来说根本不起作用,那么我错过了什么呢 我个人在需要控制台和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();
}
#包括
#包括
#包括
#包括
类控制台
{
私人:
std::wstreambuf*CinBuffer,*CoutBuffer,*CerrBuffer;
标准::wfstream ConsoleInput、ConsoleOutput、ConsoleError;
公众:
控制台();
控制台(常量控制台和控制台)=删除;
控制台(控制台和控制台);=删除;
~Console();
控制台和操作员=(常量控制台和其他)=删除;
控制台和操作员=(控制台和其他)=删除;
模板
void操作符我将尝试通过发布与您发布的代码完全相同的代码来回答您的问题,但添加适当的#include
文件
#include <windows.h>
#include <cstdio>
int main()
{
BOOL f = AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
}
#包括
#包括
int main()
{
BOOL f=alloconsole();
freopen(“CONIN$”,“r”,标准);
freopen(“CONOUT$”、“w”、stdout);
freopen(“CONOUT$”,“w”,标准);
}
使用Visual Studio 2013时,会出现有关“危险函数”的警告,但代码编译成功。因此,您应按原样编译上述代码。如果有错误,请更新您的问题
编辑:因为你更新了你的问题,我能看到这些错误的唯一原因是因为代码必须在一个功能块内。你不能让可执行代码行像那样单独存在
这本质上就是您发布的内容:
#include <windows.h>
#include <cstdio>
BOOL f = AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
#包括
#包括
BOOL f=alloconsole();
freopen(“CONIN$”,“r”,标准);
freopen(“CONOUT$”、“w”、stdout);
freopen(“CONOUT$”,“w”,标准);
由于上述原因,无法成功编译。我收到的错误与您的错误类似。您的\include
文件在哪里?您有编译器错误,因此请发布实际代码。如果我按照您发布的代码来处理代码,那么我当然会收到编译器错误。请参阅我的答案。您发布的内容永远不会成功如果这是您的确切程序,请成功编译。谢谢,这确实可以编译,但我接下来要做什么才能使控制台窗口显示?很抱歉,这是一个新问题。我回答了您关于编译器错误的原始问题。函数的实际运行问题和应该发生的情况应该是一个单独的问题。此外,conso如何Windows API的行为不依赖于编译器。因此,您接下来的问题与Visual Studio 2013无关。干杯,在系统允许的60分钟后,我将再次发布另一个问题。
#include <windows.h>
#include <cstdio>
int main()
{
BOOL f = AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
}
#include <windows.h>
#include <cstdio>
BOOL f = AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);