C语言中的CSI_START和CSI_END宏
#define CSI_START "\033["
#define CSI_END "\033[0m"
这两个 #define
是 C/C++ 中的预处理器宏定义,用于定义 ANSI 转义序列的字符串常量,通常用于在支持 ANSI 转义码的终端(如大多数 Linux、macOS 终端和现代 Windows 终端)中控制文本的显示格式,比如颜色、背景、光标位置等。
让我们分别解释:
1. #define CSI_START "\033["
-
#define
: 这是 C/C++ 的预处理器指令,用于定义一个宏。在编译之前,预处理器会将源代码中所有出现的CSI_START
替换为后面的字符串"\033["
。 -
CSI_START
: 这是一个宏名称,是 “Control Sequence Introducer Start” 的缩写,意为“控制序列引导符开始”。 -
"\033["
: 这是宏的实际值,一个字符串字面量。\033
: 这是八进制转义序列,表示 ASCII 码为 27 的字符,也就是 ESC (Escape) 字符。在 ANSI 转义序列中,ESC 字符是所有控制序列的起始标志。[
: 这是紧跟在 ESC 字符后面的字符,与 ESC 一起构成了标准的 CSI (Control Sequence Introducer)。完整的 CSI 是ESC [
。
-
作用:
CSI_START
定义了 ANSI 控制序列的开头部分。当你需要向终端发送一个格式化命令时,通常以CSI_START
开头,后面跟上具体的参数和最终命令字母。示例用法:
// 假设要设置文本颜色为红色 (31m) printf("%s31mThis text is red%s\n", CSI_START, CSI_END); // 展开后相当于: printf("\033[31mThis text is red\033[0m\n");
2. #define CSI_END "\033[0m"
-
CSI_END
: 这是另一个宏名称,意为“控制序列引导符结束”或更准确地说是“格式重置”。 -
"\033[0m"
: 这是宏的值。\033[
: 和CSI_START
一样,是 CSI 序列的开头。0m
: 这是具体的 ANSI 命令。0
是参数,表示“重置/正常”。m
是命令字母,表示“设置图形属性”(SGR - Select Graphic Rendition)。
-
作用:
CSI_END
定义了一个特殊的 ANSI 序列,用于重置所有先前应用的文本格式(如颜色、粗体、下划线等),将文本样式恢复到终端的默认状态。为什么重要:
- 如果你只设置了颜色(如红色)但没有用
CSI_END
重置,那么之后在该终端输出的所有文本都将是红色的,直到再次设置颜色或重置。 - 使用
CSI_END
可以确保格式化效果只作用于你期望的文本范围。
示例用法:
printf("Normal text, %s31mred text%s, back to normal.\n", CSI_START, CSI_END); // 输出: "Normal text, [红色的]red text[恢复正常], back to normal."
- 如果你只设置了颜色(如红色)但没有用
在 easylog
库中的典型用途
在日志库(如 easylog
)中,这些宏通常用于实现彩色日志。例如:
// 定义不同日志级别的颜色宏
#define LOG_COLOR_DEBUG CSI_START"36m" // 青色
#define LOG_COLOR_INFO CSI_START"32m" // 绿色
#define LOG_COLOR_WARN CSI_START"33m" // 黄色
#define LOG_COLOR_ERROR CSI_START"31m" // 红色// 打印一条带颜色的错误日志
printf("%s%sError: Something went wrong!%s\n", LOG_COLOR_ERROR, CSI_START, CSI_END);
// 或者更常见的是:
// printf(LOG_COLOR_ERROR "Error: Something went wrong!" CSI_END "\n");
总结
CSI_START "\033["
: 定义了 ANSI 转义序列的起始部分(ESC [),用于开始一个格式化命令。CSI_END "\033[0m"
: 定义了一个用于重置所有文本格式的 ANSI 序列,确保格式化效果不会“泄漏”到后续输出中。
这两个宏使得在 easylog
这样的库中添加和管理彩色输出变得非常方便和清晰。