C语言中的CSI_START和CSI_END宏

c 复制代码
#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 开头,后面跟上具体的参数和最终命令字母。

    示例用法:

    c 复制代码
    // 假设要设置文本颜色为红色 (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 可以确保格式化效果只作用于你期望的文本范围。

    示例用法:

    c 复制代码
    printf("Normal text, %s31mred text%s, back to normal.\n", CSI_START, CSI_END);
    // 输出: "Normal text, [红色的]red text[恢复正常], back to normal."

easylog 库中的典型用途

在日志库(如 easylog)中,这些宏通常用于实现彩色日志。例如:

c 复制代码
// 定义不同日志级别的颜色宏
#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 这样的库中添加和管理彩色输出变得非常方便和清晰。