c++ - SDL Console 输出在调试时有效,但在使用 exe 运行时无效

标签 c++ console sdl codeblocks freopen

我正在编写一个实验性网络程序,基本上是一个学习网络的测试程序。我在带有 mingw 的 Code::Blocks 中使用 SDL 和 SDL_net,因此控制台输出被定向到 stdout.txt。我四处搜索,发现您可以通过在 SDL_Init() 之后包含来解决此问题:

freopen("CON", "w", stdout); //stops redirect of output
freopen("CON", "w", stderr); //and errors...

这非常有效,但仅当在 IDE 中构建和运行程序时:在 IDE 之外运行时(例如双击程序)程序运行正常,但控制台输出除外,它仍然是空白.由于该程序应该是一个控制台程序,这是一个严重的问题...我不想总是在 IDE 中运行该程序才能使用它。

任何解决方案都值得赞赏,但我更希望它是对代码的更改,尽管在紧要关头一个批处理文件就可以了(我读过几篇文章,其中这是唯一有效的方法,但他们没有没有详细介绍,所以我无法复制它)。谢谢。

最佳答案

对于 (MinGW) SDL 2.0 用户

SDL 2.0 默认禁用控制台,或者更确切地说,它不启用它。 由于使用 -mwindows 进行编译会禁用控制台,因此 stdout 不会指向任何内容。 SDL_Log 有点高级,可以使用 Windows API 找到控制台,但它无法捕获标准输入,因为 cmd.exe 偷走了它:(。

由于各种原因,SDL 未声明控制台,很可能是因为该程序是使用 -mwindows 编译的。将 WinMain 指定为入口点也可能使 cmd.exe 回收控制台。根据我的阅读,SDL_main 可能会重定向 stdout 和 stderr。

你可能可以通过 #undef'ing main 和/或

  • SDL_init(...); 之后调用 AllocConsole();;
  • 使用freopen("CON", stdout)
  • 在没有-mwindows 的情况下编译(#undef'ing main 似乎没有任何效果)

但你真的应该将 stdout 重定向到例如猫,main | cat(始终遵循“除非必须,否则不要#undef main”的规则)。

TL;博士

要为 MinGW 捕获 stdout,只需将您的程序重定向到 cat:main |猫。这是一个 hack,它只是确保 stdout 和 stderr 不指向任何内容。
要同时捕获 stdinstdout,请在不使用 -mwindows 的情况下进行编译以创建 Windows 控制台应用程序。如有必要,这将打开一个新窗口。

注意:使用上述方法之一时刷新输出尤为重要。无论如何,依赖行缓冲是不好的做法。

关于c++ - SDL Console 输出在调试时有效,但在使用 exe 运行时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593783/

相关文章:

c++ - 在 'SDL_PollEvent'中测试 'while'的正确方法

c++ - SDL IMG_loadTexture 和其他硬盘

C++11 数组初始化不会调用复制构造函数

C++ 如何在 while 循环中正确使用线程

Linux 控制台更改,打印 OK,读取 NOK

javascript - jQuery keyup 工作不正确

C++ sizeof 自定义类返回不正确的值?

c++ - 如何从 C++ 代码中检索 QML 的 TextField 中的文本?

Python 终端/文本 UI (TUI) 库

C++ 和 SDL2 - "Auto-Generate"使用了 DLL?