Windows下应优先用SetConsoleTextAttribute配合GetStdHandle实现颜色控制,Linux/macOS用ANSI转义序列;需运行时探测终端能力并支持重定向降级,且提供NO_COLOR环境变量等可配置开关。
Windows下用SetConsoleTextAttribute控制颜色
Windows原生控制台不支持ANSI转义序列(除非启用VT100模式且系统版本≥Win10 1607),更稳妥的方式是调用WinAPI。关键函数是SetConsoleTextAttribute,它需要一个HANDLE(通常用GetStdHandle(STD_OUTPUT_HANDLE)获取)和一个WORD颜色值。
颜色值由前景色(低4位)和背景色(高4位)组成,例如FOREGROUND_RED | FOREGROUND_INTENSITY表示亮红色文字。注意:默认控制台句柄可能被重定向(如管道或重定向到文件),调用前建议用GetConsoleScreenBufferInfo确认是否为真实控制台,否则会静默失败。
- 必须在每次输出前设置,颜色不会自动继承到下一行
-
SetConsoleTextAttribute只影响后续输出,已打印的内容不可修改 - 若程序以非控制台子系统(
/SUBSYSTEM:WINDOWS)链接,GetStdHandle可能返回INVALID_HANDLE_VALUE,需提前判断
Linux/macOS用ANSI转义序列输出颜色
绝大多数POSIX终端支持CSI(Control Sequence Introducer)序列,格式为\033[m,其中是数字组合,如31代表红色前景,42代表绿色背景,多个代码可用分号连接(如31;47是红字白底)。
常见代码:30–37(前景色)、40–47(背景色)、1(高亮)、22(取消高亮)、0(重置所有属性)。注意:这些序列是纯文本,无平台API依赖,但需确保输出流未被重定向到非终端设备(如文件或管道),否则会直接打印乱码。
立即学习“C++免费学习笔记(深入)”;