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

宏定义介绍

假设我们有以下代码:

LOG_INFO("rkipc_ini_path_ is %s, rkipc_iq_file_path_ is %s, rkipc_log_level is %d\n",
         rkipc_ini_path_, rkipc_iq_file_path_, rkipc_log_level);

1. LOG_INFO 宏定义

根据之前的 LOG_INFO 宏定义:

#define LOG_INFO(format, ...)                                                                      \
    do {                                                                                           \
        if (rkipc_log_level < LOG_LEVEL_INFO)                                                      \
            break;                                                                                 \
        if (enable_minilog)                                                                        \
            minilog_info("[%s][%s]:" format, LOG_TAG, __FUNCTION__, ##__VA_ARGS__);                \
        else                                                                                       \
            fprintf(stderr, "[%s][%s]:" format, LOG_TAG, __FUNCTION__, ##__VA_ARGS__);             \
    } while (0)
  • format 是你传递的日志格式字符串:"rkipc_ini_path_ is %s, rkipc_iq_file_path_ is %s, rkipc_log_level is %d\n"
  • __VA_ARGS__ 是可变参数,传递给宏的具体参数:rkipc_ini_path_, rkipc_iq_file_path_, rkipc_log_level

2. 宏展开

当你调用 LOG_INFO 时,宏会展开为下面的代码:

do {
    if (rkipc_log_level < LOG_LEVEL_INFO) 
        break;
    if (enable_minilog) 
        minilog_info("[%s][%s]:" format, LOG_TAG, __FUNCTION__, ##__VA_ARGS__);
    else 
        fprintf(stderr, "[%s][%s]:" format, LOG_TAG, __FUNCTION__, ##__VA_ARGS__);
} while (0)
  • 宏首先检查 rkipc_log_level 是否大于等于 LOG_LEVEL_INFO,如果小于则跳过日志输出。
  • 然后,检查 enable_minilog 是否为 true。如果为 true,调用 minilog_info;否则,使用 fprintf 输出日志信息。

3. 日志格式化

format 参数为:

"rkipc_ini_path_ is %s, rkipc_iq_file_path_ is %s, rkipc_log_level is %d\n"

__VA_ARGS__ 参数分别为:

  • rkipc_ini_path_
  • rkipc_iq_file_path_
  • rkipc_log_level

假设它们的值分别是:

rkipc_ini_path_ = "/path/to/config.ini";
rkipc_iq_file_path_ = "/path/to/iq_file";
rkipc_log_level = 3;

在这种情况下,LOG_INFO 调用将会被展开为:

if (rkipc_log_level < LOG_LEVEL_INFO)
    break;
if (enable_minilog)
    minilog_info("[%s][%s]: rkipc_ini_path_ is %s, rkipc_iq_file_path_ is %s, rkipc_log_level is %d\n",
                 LOG_TAG, __FUNCTION__,
                 rkipc_ini_path_, rkipc_iq_file_path_, rkipc_log_level);
else
    fprintf(stderr, "[%s][%s]: rkipc_ini_path_ is %s, rkipc_iq_file_path_ is %s, rkipc_log_level is %d\n",
            LOG_TAG, __FUNCTION__,
            rkipc_ini_path_, rkipc_iq_file_path_, rkipc_log_level);
  • LOG_TAG 会被替换为 "rkipc_server",这是日志标记。
  • __FUNCTION__ 会被替换为当前函数的名称,例如 "main",表示调用 LOG_INFO 的函数。
  • %s%d 会分别被 rkipc_ini_path_, rkipc_iq_file_path_, rkipc_log_level 的值替换。

4. 最终输出

如果 enable_minilog = 1(启用了 minilog),则输出:

minilog_info("[rkipc_server][main]: rkipc_ini_path_ is /path/to/config.ini, rkipc_iq_file_path_ is /path/to/iq_file, rkipc_log_level is 3");

如果 enable_minilog = 0(禁用了 minilog),则输出到标准错误:

fprintf(stderr, "[rkipc_server][main]: rkipc_ini_path_ is /path/to/config.ini, rkipc_iq_file_path_ is /path/to/iq_file, rkipc_log_level is 3");

http://www.kler.cn/a/452224.html

相关文章:

  • [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构
  • AppAgent 源码 (xml 解析)
  • 机器学习基础 衡量模型性能指标
  • flask-admin的modelview 实现list列表视图中扩展修改状态按钮
  • CentOS Stream 9 挂载Windows共享FTP文件夹
  • 【Python】基础语法介绍
  • mysql双主双从
  • 《Mycat核心技术》第06章:Mycat问题处理总结
  • 短视频矩阵系统的视频批量剪辑源码技术开发,支持OEM
  • 人工智能ACA(七)——计算机视觉基础
  • Vue3入门(8)
  • THREE.js 入门(六) 纹理、uv坐标
  • 深入探索 npm cache clean --force:清理 npm 缓存的艺术
  • Python + 深度学习从 0 到 1(03 / 99)
  • Pyside6 在 pycharm 中的配置
  • 数据库 SQL 常用语句全解析
  • 瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
  • Matplotlib中隐藏坐标轴但保留坐标轴标签的3D图
  • 面经zhenyq
  • 图像处理-Ch5-图像复原与重建
  • 前端取Content-Disposition中的filename字段与解码(vue)
  • 「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
  • 【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
  • CPU架构的变化史
  • 用Python写炸金花游戏
  • CoinShares预测2025年加密市场前景看涨