为啥通过 system("color YX") 在 C++ 控制台应用程序中更改颜色不是最佳解决方案?
Posted
技术标签:
【中文标题】为啥通过 system("color YX") 在 C++ 控制台应用程序中更改颜色不是最佳解决方案?【英文标题】:Why changing colors in C++ console application by system("color YX") is not the best solution?为什么通过 system("color YX") 在 C++ 控制台应用程序中更改颜色不是最佳解决方案? 【发布时间】:2012-01-30 02:19:48 【问题描述】:我在某处读到,(知道这两种方式都只适用于 Windows)使用 system 不是最好的解决方案。
为什么
#include<windows.h>
...
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut,BACKGROUND_RED);
更好?
据我所知,那个系统(“color YX”)改变了整个控制台的颜色。但是我认为,有一种方法可以通过在打印文本期间“打开和关闭”某些颜色来实现。
系统(命令)在与系统/控制台通信期间是否会使用附加层,使用第二种方法可以避免什么?
我应该使用第二种方法还有其他原因吗?
【问题讨论】:
【参考方案1】:我应该使用第二种方法还有其他原因吗?
system(command)
将在任何系统上编译,无论“命令”是什么。使用 windows 函数可确保您的代码仅在其实际运行的系统上编译。下线,如果你想移植这段代码,你会得到一个明确的编译器错误,所以你会花更少的时间来追踪你的代码不工作的原因。
【讨论】:
+1 也很容易为例如 OS X 或 Unix 创建一个包装器,以提供与SetConsoleTextAttribute
函数等效的功能,而这些系统上没有 color
命令。
【参考方案2】:
优化方面,系统(命令)调用创建一个单独的进程,传递参数“color XY”,然后该进程搜索命令“color”并执行它。
请注意,由于颜色是控制台内部命令,它的执行几乎是立即的。但是,对于非内部命令,它会创建另一个进程并在该单独进程中执行该命令。
这意味着创建 2 个非常慢的进程(每个进程 2Mb 的堆栈,完整的进程信息,例如 IP 地址、寄存器、stdin/stdout/stderr...)
【讨论】:
以上是关于为啥通过 system("color YX") 在 C++ 控制台应用程序中更改颜色不是最佳解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 System.getProperty("home.dir") 返回 null [重复]
如果 typeof(Xyz) 存在,为啥 System.Type.GetType("Xyz") 返回 null?