为啥通过 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 [重复]

一道java简单的题目

如果 typeof(Xyz) 存在,为啥 System.Type.GetType("Xyz") 返回 null?

为啥在 C++ 方法中使用 system("some.exe") 不像命令行那样工作?

html 设置返回顶部为啥失效

java类名直接访问静态变量为啥不通过,提示Demo3.java:11: 不是语句