c++ - Visual Studio 2012 C++ 标准输出

标签 c++ output

编译 Win32 应用程序时,fprintf(stdout/stderr) 在 Visual Studio 中打印到哪里?我一直听到它进入输出,但我看不到它!。

在没有 C++ 控制台窗口的情况下打印到输出日志的标准方法是什么?

最佳答案

如果您的程序与/SUBSYSTEM:WINDOWS 链接,您将看不到控制台输出,除非您分配一个控制台。

这是分配控制台选项的代码。使用此方法,您不需要更改链接器设置或创建 WinMain。

static void OpenConsole()
{
    int outHandle, errHandle, inHandle;
    FILE *outFile, *errFile, *inFile;
    AllocConsole();
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = 9999;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    outHandle = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    errHandle = _open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE),_O_TEXT);
    inHandle = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT );

    outFile = _fdopen(outHandle, "w" );
    errFile = _fdopen(errHandle, "w");
    inFile =  _fdopen(inHandle, "r");

    *stdout = *outFile;
    *stderr = *errFile;
    *stdin = *inFile;

    setvbuf( stdout, NULL, _IONBF, 0 );
    setvbuf( stderr, NULL, _IONBF, 0 );
    setvbuf( stdin, NULL, _IONBF, 0 );

    std::ios::sync_with_stdio();

}

如果您不想直接分配控制台,您也可以通过更改链接器设置的子系统将子系统从/SUBSYSTEM:WINDOWS 更改为/SUBSYSTEM:CONSOLE。请记住,启用/SUBSYSTEM:CONSOLE 后,GUI 仍将像以前一样工作,但 Windows 将为您创建一个控制台窗口以及您的应用程序。

在我的 Qt 代码中,这就是所需的全部内容。但是,当我在 VisualStudio 中尝试 MFC 并通过链接器设置将子系统设置为控制台时。我收到以下错误:

1>------ Build started: Project: MFCApplication1, Configuration: Debug Win32 ------
1>  MFCApplication1.cpp
1>msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>X:\Test\VC.110\MFCTest\MFCApplication1\Debug\MFCApplication1.exe : fatal error LNK1120: 1 unresolved externals

这是由于入口点在控制台应用程序中默认为 main() 而在 Windows 应用程序中默认为 WinMain。要解决此问题,我必须将以下内容添加到高级链接器设置的入口点设置中:“wWinMainCRTStartup”

在评论中,Ben Voigt 提出了另一种方法。使用 editbin 更改子系统不需要更改入口点。确实如此。我删除了入口点并将窗口放回原处,因为子系统构建了测试应用程序,然后使用 editbin 使用以下命令更改子系统:

X:\Test\VC.110\MFCTest\MFCApplication1\Debug>editbin MFCApplication1.exe /SUBSYSTEM:CONSOLE
Microsoft (R) COFF/PE Editor Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

然后我在控制台中得到了预期的输出:

X:\Test\VC.110\MFCTest\MFCApplication1\Debug>MFCApplication1.exe
Hello from a windows application!
 

注意:使用 editbin 方法,您需要在每次更新可执行文件时启用它。

最后,一旦您拥有控制台 printf 或 std::cout 就可以使用任何一种方法。例如,在我的测试 MFC 应用程序中,我将以下行添加到 CMFCApplication1App 类的构造函数中:

std::cout << "Hello from a windows application!" << std::endl;

关于c++ - Visual Studio 2012 C++ 标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25580684/

相关文章:

C++ 转换 float 错误地更改数字

java - 总是返回 false

java - 计数输出不正确

c++ - 在//C++ 注释中使用\\是否合法? (C++ 注释中的 LaTeX 方程)

c++ - 取消时可以将 boost::asio::yield_context 用作 deadline_timer 处理程序吗?

c++ - 赋值运算符和深拷贝

java - System.out.print() 读取 Scanner 错误

java - Java 中的 Shunting-Yard 算法实现给出了错误的输出和字符串索引超出范围?

powershell - 如何将输出输出到变量

c++ - 如何在C++中导致length_error异常