宏定义介绍

devtools/2024/12/26 10:51:46/

假设我们有以下代码:

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);
elsefprintf(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.ppmy.cn/devtools/145511.html

相关文章

springboot485基于springboot的宠物健康顾问系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统宠物健康顾问系统信息管理难度大&#xff0c;容错率低&am…

软件项目需求分析的实践探索(1)

一、项目启动与规划 组建团队 包括项目经理、系统分析师、业务分析师以及可能涉及的最终用户代表和领域专家等。例如&#xff0c;开发一个医疗管理软件&#xff0c;就需要有医疗行业的专家参与&#xff0c;确保对医疗业务流程有深入理解。明确各成员的职责&#xff0c;如系统分…

企业司法风险如何查询?如何通过司法风险API评估企业风险?

「企业司法风险」 司法风险指的是企业在经营过程中可能面临的法律后果&#xff0c;这种风险可能源于外部法律环境的变动&#xff0c;或是由于企业自身及其他相关方未能遵循法律规定或合同条款而产生。它包括了开庭通知、诉讼案件、法院公告、消费限制、执行情况、终结案件、送…

Matrix-Breakout 2 Morpheus靶场

第一步 信息收集 (1)寻找靶场真实ip arp-scan -l 靶场真实 ip 为192.168.152.154 (2)探测端口及服务 nmap -p- -sV 192.168.52.135 第二步 开始渗透 (1)访问web服务 http://192.168.152.154 and http://192.168.52.135:81 发现 81 端口的页面要登录 我们使用…

【赵渝强老师】MongoDB逻辑存储结构

MongoDB的逻辑存储结构是一种层次结构&#xff0c;主要包括了三个部分&#xff0c;即&#xff1a;数据库&#xff08;Database&#xff09;、集合&#xff08;Collection&#xff0c;也可以叫做表&#xff09;和文档&#xff08;Document&#xff0c;也可以叫做记录&#xff09…

C语言实现顺序表详解

文章目录 [TOC] 1.前言&#x1f64b;&#x1f3fc;‍♂️2.顺序表&#x1f9e3;2.1 顺序表盖帘&#x1f9e3;2.2 顺序表特点&#x1f9e3;2.2 顺序表作用&#x1f9e3; 3.顺序表基操&#x1f9e4;3.1 结构体初始化&#x1f389;3.2 顺序表初始化&#x1f389;3.3 顺序表创建&am…

华为原生鸿蒙5.0与代理IP的奇妙融合

目录 一、华为原生鸿蒙5.0简介 二、代理IP技术详解 三、鸿蒙5.0与代理IP的融合应用 四、设置与操作 五、案例分析 六、注意事项 七、未来展望 在数字世界的浩瀚宇宙中&#xff0c;操作系统如同星际间的桥梁&#xff0c;连接着设备与服务。华为原生鸿蒙5.0&#xff0c;这颗…

多数据源情况下,数据库连接池的加载流程

在多数据源配置的场景下&#xff0c;默认数据源的选择是一个重要的问题&#xff0c;特别是在引入动态数据源时。本文将详细分析为什么在默认情况下会使用 Druid 数据源&#xff0c;并展示相关的执行流程和源码。 单数据源的数据库连接池加载流程可以看这篇文章单数据源数据库连…