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)序列,格式为