为什么Visual Studio在调试时对ANSI Escape代码有不同的处理方式

Why does Visual Studio treat ANSI Escape codes differently when debugging?

本文关键字:代码 方式 处理 Escape ANSI Studio Visual 调试 为什么      更新时间:2023-10-16

适用于:

  • Visual Studio社区版2015(C++)
  • Windows 10

Visual Studio有两种为Win32控制台运行C++程序的方法:"启动而不调试(Ctrl+F5)"answers"启动调试(F5)"。两者都将为程序启动一个单独的控制台窗口。如果程序通过cout发送ANSI转义码,第一个窗口会按预期工作,但第二个窗口会将代码显示为字符,不可打印的代码(如ESC)会被框中的问号替换。

为什么不同?有没有一种方法可以让ANSI转义码在调试时正常运行?

2015年的文档没有说明有限制(早期版本需要付费版本)。

使用Visual Studio,您可以使用调试器连接到正在运行的进程,这样可以避免出现问题—前提是您的程序可以初始化并等待您执行此操作。

至于为什么不同,这可能是因为调试器正在拦截控制台窗口中运行的程序的输入/输出(并阻止它更改I/O模式)。

进一步阅读:

  • 使用Visual Studio调试器附加到正在运行的进程(2015)
  • 如何:连接到正在运行的流程(2010)

从后续评论中,@Sean Gugler意识到

  • 可执行文件的ANSI代码在本机运行时没有被解释(例如从文件资源管理器打开)
  • 但在从Visual Studio正常运行时工作

当被提醒Windows 10控制台窗口解释ANSI转义序列时,

  • 他验证了可执行文件在控制台窗口中按预期运行,并且
  • 推测Visual Studio在调试时直接运行可执行文件(没有控制台窗口)(F5),但在正常运行可执行程序时确实在控制台窗口中运行了它(ctrlF5

从GUI(如Visual Studio)启动控制台应用程序的问题之一是,应用程序必须做一些额外的工作来分配控制台。

进一步阅读:

  • 一个可执行文件可以既是控制台又是GUI应用程序吗
  • 在窗口中的GUI应用程序中使用控制台,仅当它从控制台运行时
  • 如何在GUI应用程序中写入控制台