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

[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.xdnf.cn/news/862903.html

相关文章:

  • 让视觉基础模型(VFMs)像大语言模型(LLMs)一样“会思考”​
  • 3D视觉重构工业智造:解码迁移科技如何用“硬核之眼“重塑生产节拍
  • SOLIDWORKS 2025教育版提供了丰富的自学资源
  • LabVIEW与Modbus/TCP温湿度监控系统
  • 扫地机产品--材质传感器算法开发与虚拟示波器
  • R语言基础| 下载、安装
  • Elasticsearch中的文档(Document)介绍
  • 代码随想录算法训练营第60期第五十七天打卡
  • Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程(二)
  • 第八部分:阶段项目 6:构建 React 前端应用
  • 华为OD机试_2025 B卷_区间交集(Python,100分)(附详细解题思路)
  • ann算法的种类有哪些,之间的区别,各自的适用场景
  • 每日算法刷题Day22 6.4:leetcode二分答案3道题,用时1h30min
  • 如何在 HTML 中添加按钮
  • 信号与系统汇总
  • Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析
  • RabbitMQ 在解决数据库高并发问题中的定位和核心机制
  • Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测
  • 设计模式-外观模式
  • Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
  • 高速ADC数据格式与JESD204B IP数据格式映射关系
  • 数智破局·生态共生:重构全球制造新引擎 2025 WOD制造业数字化博览会即将在沪盛大启幕
  • LINUX64 FTP 1; rsync inotify.sh脚本说明
  • 银行用户评分规则 深度学习
  • 使用 Ansys Q3D 进行电容提取
  • 【android bluetooth 协议分析 14】【HFP详解 1】【案例一: 手机侧显示来电,但车机侧没有显示来电: 讲解AT+CLCC命令】
  • 分析Web3下数据保护的创新模式
  • MVCC理解
  • vscode中无法使用npm node
  • Windows 12确认没了,Win11 重心偏移修Bug