最稳妥的windows控制台文字着色方式是调用setconsoletextattribute api,需先用getstdhandle获取句柄、getconsolemode确认控制台有效,再传入位掩码颜色值(如foreground_red|foreground_intensity),且每次输出后须手动重置,重定向到文件时应降级为纯文本。

用 SetConsoleTextAttribute 改变 Windows 控制台文字颜色
Windows 控制台不支持 ANSI 转义序列(除非启用虚拟终端处理且系统版本 ≥ Win10 1607),直接输出 [31mkeyword[0m 大概率显示乱码或原样打印。最稳妥的方式是调用 Win32 API:SetConsoleTextAttribute。
它需要一个 HANDLE(通常用 GetStdHandle(STD_OUTPUT_HANDLE) 获取)和一个表示颜色的 WORD 值,比如 FOREGROUND_RED | FOREGROUND_INTENSITY 表示亮红色。
- 必须在每次输出前调用,颜色不会自动恢复 —— 忘了重置会导致后续所有文字都变色
- 颜色值不是 RGB,而是位掩码组合;
FOREGROUND_BLUE | FOREGROUND_GREEN是青色,不是“蓝+绿=黄” - 如果程序被重定向到文件(如
app.exe > out.txt),SetConsoleTextAttribute会失败,需先用GetConsoleMode检查是否真在控制台里
Linux/macOS 下用 ANSI 转义序列要检查 TERM 和是否为终端
Linux/macOS 默认支持 [33m 这类序列,但前提是:当前 stdout 确实连着终端,且 TERM 环境变量非空(比如 xterm-256color)。否则可能输出可见的转义字符,或者被静默丢弃。
推荐用 isatty(STDOUT_FILENO) 判断是否为终端,再决定是否启用高亮 —— 否则用户把输出管道给 grep 或重定向到日志时,会看到一堆 ^[[32m 类乱码。
立即学习“C++免费学习笔记(深入)”;
-
[1m是加粗,[38;5;172m是 256 色模式下的橙色,但老终端可能只认 16 色([31m~[37m) - 高亮关键词前后必须用
[0m重置,否则影响后续所有输出;别漏掉末尾的重置 - C++ 字符串字面量里写
"[32m"没问题,但若用std::string拼接,注意不要误把当成字符串结束符(它只是 ASCII 27,不是
