当前位置: 首页 > article >正文

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

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

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

宏结构分析

#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 宏的实现为:

#define STR(x) #x

那么:

_LOG_TAG

会被展开为:

"SENSOR"

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

log_info("温度读数: %d", temp);

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

[Info]: SENSOR温度读数: 25

多级字符串化技巧

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

#define MODULE_NAME SENSOR
#define LOG_TAG_CONST MODULE_NAME

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

#define STR(x) #x
#define XSTR(x) STR(x)  // 二级字符串化宏#define _LOG_TAG                        XSTR(LOG_TAG_CONST)

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

使用建议

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

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

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

    #define STR(x) #x
    #define XSTR(x) STR(x)
    #define _LOG_TAG XSTR(LOG_TAG_CONST)
    

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

http://www.lryc.cn/news/2400890.html

相关文章:

  • 自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?
  • 内网应用如何实现外网访问?无公网IP本地端口网址服务提供互联网连接
  • 大话软工笔记—组合要素1之要素
  • oracle从表B更新拼接字段到表A
  • 平台化 LIMS 系统架构 跨行业协同与资源共享的实现路径
  • RedisTemplate查询不到redis中的数据问题(序列化)
  • 如何利用乐维网管进行IP管理
  • unix/linux,sudo,其历史争议、兼容性、生态、未来展望
  • git stash命令用法
  • SkyWalking如何实现跨线程Trace传递
  • 软件工程专业的本科生应该具备哪些技能
  • 使用 Spring Boot 3.3 和 JdbcTemplate 操作 MySQL 数据库
  • CentOS 7 修改为静态 IP 地址完整指南
  • 企业级高防CDN选型指南
  • Redis-6.2.9 cluster集群部署和扩容缩容
  • Java求职者面试指南:DevOps技术栈深度解析
  • 生产环境中安装和配置 Nginx 以部署 Flask 应用的详细指南
  • Axure高保真LayUI框架 V2.6.8元件库
  • 通讯录实现(Linux+Cpp)
  • K8S主机漏洞扫描时检测到kube-服务目标SSL证书已过期漏洞的一种永久性修复方法
  • 质检 LIMS 系统数据防护指南 三级等保认证与金融级加密方案设计
  • Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)
  • 79. Word Search
  • 结构性设计模式之Facade(外观)设计模式
  • ICML 2025 Spotlight | 机器人界的「Sora」!让机器人实时进行未来预测和动作执行!
  • CSP严格模式返回不存在的爬虫相关文件
  • https(SSL)证书危机和可行的解决方案
  • C#获取磁盘容量:代码实现与应用场景解析
  • 2359. 找到离给定两个节点最近的节点
  • 前端导入Excel表格