Windows下需用SetConsoleTextAttribute或启用ANSI模式,Linux/macOS直接支持ANSI序列;跨平台应封装颜色函数,避免混用方案且Windows必须显式启用VT模式。

Windows 平台下,std::cout 默认不支持颜色;直接输出 ANSI 转义序列在旧版 Windows 控制台(如 cmd.exe 未启用 VT 模式时)会显示乱码或无效果。跨平台稳定方案不存在,必须按运行环境区分处理。
Windows 上用 SetConsoleTextAttribute(推荐用于传统 cmd/powershell)
这是最可靠、无需额外依赖的方式,适用于 Windows 7 及以上。需包含 ,且只对当前控制台句柄生效。
常见错误:调用前没获取有效句柄,或忽略返回值导致颜色未生效。
-
GetStdHandle(STD_OUTPUT_HANDLE)必须检查是否为INVALID_HANDLE_VALUE - 颜色值是前景色与背景色的按位或,例如
FOREGROUND_RED | FOREGROUND_INTENSITY表示亮红色文字 - 每次输出前需重置属性,否则后续所有输出都保持该颜色
#include#include void setTextColor(WORD color) { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); if (hOut != INVALID_HANDLE_VALUE) { SetConsoleTextAttribute(hOut, color); } } int main() { setTextColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY); std::cout << "这行是亮绿色\n"; setTextColor(FOREGROUND_RED); // 重置为普通红色 std::cout << "这行是暗红色\n"; setTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); // 白色 std::cout << "这行是白色\n"; return 0; }
Windows 启用 ANSI 转义序列(适用于 Win10 1511+,支持 \033[31m)
现代 Windows 控制台(ConHost)默认禁用 ANSI 解析,需手动启用控制台虚拟终端处理模式。不启用就直接输出 \033[32m 会原样打印或报错。
立即学习“C++免费学习笔记(深入)”;
- 调用
SetConsoleMode开启ENABLE_VIRTUAL_TERMINAL_PROCESSING - 仅对当前进程有效,子进程不会继承该设置
- ANSI 序列兼容性更好(如支持 256 色、RGB),但旧版系统(Win7/8)完全不识别
#include#include int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); DWORD dwMode = 0; GetConsoleMode(hOut, &dwMode); dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(hOut, dwMode); std::cout << "\033[32m绿色文字\033[0m\n"; std::cout << "\033[1;33m亮黄色\033[0m\n"; return 0; }
Linux/macOS 直接使用 ANSI 转义序列(无需额外配置)
终端原生支持,\033[34m 等可直接用。但注意:std::cout 缓冲可能导致颜色延迟应用,尤其搭配 std::endl 或换行符缺失时。
- 常用代码:
\033[31m(红)、\033[33m(黄)、\033[1m(加粗)、\033[0m(重置) - 避免硬编码字符串,可用宏或 inline 函数封装,例如:
#define RED "\033[31m" - 某些 IDE 内置终端(如 CLion、VS Code 的集成终端)可能模拟不全,建议优先在真实终端中测试
跨平台封装建议(避免条件编译污染业务逻辑)
不要在每个 std::cout 前写 #ifdef _WIN32。把颜色逻辑收进一个轻量类或函数里,内部按平台分发。
关键点在于:Windows 下两种方式不能混用(SetConsoleTextAttribute 和 ANSI 同时启用会导致行为不可预测),且 ANSI 方式在 Windows 必须显式开启模式——这个初始化步骤很容易被遗漏,一旦漏掉,程序在 Windows 上就“看起来没颜色”,却查不出原因。











