[C]C语言日志系统宏技巧解析

代码解释:日志标签字符串化宏

这段代码定义了一个名为 _LOG_TAG 的宏,用于将 LOG_TAG_CONST 转换为字符串形式。这在日志系统中很常见,用于为不同模块添加标识前缀。

宏结构分析

c 复制代码
#define _LOG_TAG                        STR(LOG_TAG_CONST)

这个宏包含两个关键部分:

  1. STR

    • 这是一个用于将参数转换为字符串的宏
    • 通常定义为:#define STR(x) #x,其中 # 是C语言的字符串化操作符
    • 例如,STR(FOO) 会被展开为 "FOO"
  2. LOG_TAG_CONST

    • 这是一个需要用户定义的常量,代表模块名或标签
    • 例如,在某个文件中可能会定义:#define LOG_TAG_CONST "SENSOR"

宏展开示例

假设 LOG_TAG_CONST 被定义为 "SENSOR",并且 STR 宏的实现为:

c 复制代码
#define STR(x) #x

那么:

c 复制代码
_LOG_TAG

会被展开为:

c 复制代码
"SENSOR"

这个字符串通常会作为日志前缀,例如在之前的 log_info 宏中:

c 复制代码
log_info("温度读数: %d", temp);

最终会生成类似这样的日志输出:

复制代码
[Info]: SENSOR温度读数: 25

多级字符串化技巧

在某些情况下,你可能需要对已经是宏的参数进行字符串化。例如:

c 复制代码
#define MODULE_NAME SENSOR
#define LOG_TAG_CONST MODULE_NAME

此时直接使用 STR(LOG_TAG_CONST) 会得到 "MODULE_NAME",而不是 "SENSOR"。为了解决这个问题,通常需要使用两级字符串化:

c 复制代码
#define STR(x) #x
#define XSTR(x) STR(x)  // 二级字符串化宏

#define _LOG_TAG                        XSTR(LOG_TAG_CONST)

这样,当 LOG_TAG_CONST 是另一个宏时,也能正确展开为对应的字符串。

使用建议

  1. 在每个源文件中定义 LOG_TAG_CONST

    c 复制代码
    // sensor.c
    #define LOG_TAG_CONST "SENSOR"
  2. 确保 STR 宏在使用 _LOG_TAG 之前被定义:

    c 复制代码
    #define STR(x) #x
    #define _LOG_TAG STR(LOG_TAG_CONST)
  3. 如果需要多级展开,使用 XSTR 宏:

    c 复制代码
    #define STR(x) #x
    #define XSTR(x) STR(x)
    #define _LOG_TAG XSTR(LOG_TAG_CONST)

这种设计使得日志系统更加模块化,不同的源文件可以使用不同的标签,便于调试和维护。

相关推荐
AI人工智能+电脑小能手10 小时前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
LuminousCPP10 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
xbgRS10 小时前
java中的线程
java
带鱼吃猫10 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言
程序员老陆11 小时前
说一说FFmpeg6在Linux平台的编译
linux·运维·服务器·ffmpeg
玫幽倩11 小时前
2026黄河流域公安院校-电子物证单项赛(程序逆向分析+服务器取证)
运维·服务器·python·电子取证·逆向·程序分析·服务器取证
ChaHae-In11 小时前
MyBatis入门操作
java·mybatis
xcLeigh11 小时前
Go入门:短变量声明的陷阱与最佳实践
java·redis·golang·教程·变量
(Charon)11 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
青山木11 小时前
Hot 100 --- 最小栈
java·数据结构·算法·leetcode