为什么Visual Studio在调试时对ANSI Escape代码有不同的处理方式
Why does Visual Studio treat ANSI Escape codes differently when debugging?
适用于:
- 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应用程序中写入控制台
相关文章:
- 在c代码之间共享数据的最佳方式
- 不同/较旧的处理器运行c++代码的方式是否不同
- 如何以静态代码分析友好的方式使用 #define 防护?
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- c++ Visual Studio 2015 快捷方式,用于从选择代码中生成功能
- 我如何在一个 if 语句中声明所有数字我尝试通过其他方式声明所有数字,如果一个接一个,但似乎代码有逻辑错误
- 为什么我的代码在添加不相关的代码行后工作方式不同?
- 在Qt Creator中应用代码更改的快捷方式是什么?
- 如何在运行时以选择性方式排除代码块
- 如何以这种方式在 C++ 中打印 ASCII 代码值
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- 以有效的方式从 Node .js运行 C 或C++代码
- 如何在现有 c++ 代码中以功能方式实现遥测
- 视觉工作室代码远程调试C 类似Netbeans的方式
- 在某些代码中覆盖方法的方式是什么?
- 以简单且更少的代码方式将字符串添加在一起
- 以迭代方式编写递归代码
- 为什么相同的代码在Visual Studio和Dev-C++中运行方式不同
- 为什么这段代码在Mac和Red Hat中的运行方式如此不同
- Opencv 函数只能以 C 代码方式调用,而不能以C++方式调用