宏定义介绍

news2024/12/26 6:26:53

假设我们有以下代码:

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.coloradmin.cn/o/2265673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Postgresql】数据库忘记密码时,重置密码 + 局域网下对外开放访问设置

【Postgresql】数据库忘记密码时,重置密码 + 局域网下对外开放访问设置 问题场景数据库忘记密码时,重置密码局域网下对外开放访问设置问题场景 Postgresql可支持复杂查询,支持较多的数据类型,在生产中较为使用。但有时在局域网下,想通过外部连接使用数据库,可能会出现数…

大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库

大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客&#xff1a;https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…

数字IC前端学习笔记:脉动阵列的设计方法学(四)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构&#xff08;也称为脉动阵列&#xff09;表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…

软件工程-【软件项目管理】--期末复习题汇总

一、单项选择题 &#xff08;1&#xff09;赶工一个任务时&#xff0c;你应该关注&#xff08; C &#xff09; A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 &#xff08;2&#xff09;下列哪个不是项目管理计划的一部分&…

【Git学习】windows系统下git init后没有看到生成的.git文件夹

[问题] git init 命令后看不到.git文件夹 [原因] 文件夹设置隐藏 [解决办法] Win11 win10

《Posterior Collapse and Latent Variable Non-identifiability》

看起来像一篇很有用的paper&#xff0c;而且还是23年的 没看完 后边看不懂了 Abstract 现有的解释通常将后验崩塌归因于由于变分近似而使用神经网络或优化问题。 而本文认为后验崩塌是潜在变量不可识别性的问题(a problem of latent variable non-identifiability) 本文证明了…

申请腾讯混元的API Key并且使用LobeChat调用混元AI

申请腾讯混元的API Key并且使用LobeChat调用混元AI 之前星哥写了一篇文章《手把手教拥有你自己的大模型ChatGPT和Gemini等应用-开源lobe-chat》搭建的开源项目&#xff0c;今天这篇文章教大家如何添加腾讯云的混元模型&#xff0c;并且使用LobeChat调用腾讯混元AI。 申请腾讯混…

Navicat通过ssh连接mysql

navicat 通过ssh连接mysql 对搭建完的mysql连接时&#xff0c;通过ssh连接的方法 需要确保mysql默认端口3306没有被防火墙阻拦 第一步 第二步 35027448270)] 需要注意的是乌班图系列的默认root的ssh是禁止的&#xff0c;应该用别的账户登录

【NACOS插件】使用官网插件更换NACOS数据库

说明 nacos 2.3.1默认支持mysql和derby数据库&#xff0c;如果想要支持其他数据库&#xff0c;可以通过使用插件方式实现。对于该插件的使用&#xff0c;官方说明文档较为粗略(不过也没问题&#xff0c;实际上整个过程就是很简单&#xff0c;只是使用者想复杂了)&#xff0c;网…

mysql基础(jdbc)

1.Java连接数据库步骤 1.注册驱动 Class<?> driverManagerClass.forName("com.mysql.cj.jdbc.Driver"); 2.获取连接 Connection conDriverManager.getConnection("jdbc:mysql://localhost:3306/studymysql","root","123456"); …

ROM修改进阶教程------修改刷机包init.rc 自启用户自定义脚本的一些基本操作 代码格式与注意事项

在很多定制化固件中。我们需要修改系统的rc文件来启动自己的一些脚本。但有时候修改会不起作用,其具体原因在于权限与代码格式的问题。博文将系统的解析代码操作编写的注意事项与各种权限分别。了解以上. 轻松编写自定义启动脚本. 通过博文了解💝💝💝 1-------💝💝…

硬件模块常使用的外部中断

对于STM32来说&#xff0c;想要获取的信号是外部驱动的很快的突发信号 例1&#xff1a;旋转编码器的输出信号&#xff1a; 可能很久都不会拧它&#xff0c;不需要STM32做任何事情但是一拧它&#xff0c;就会有很多脉冲波形需要STM32接收信号是突发的&#xff0c;STM32不知道什…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅&#xff0c;从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍&#xff1a; 一、主要功能 …

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

VTK知识学习(27)- 图像基本操作(二)

1、图像类型转换 1&#xff09;vtkImageCast 图像数据类型转换在数字图像处理中会频繁用到。一些常用的图像算子(例如梯度算子)在计算时出于精度的考虑&#xff0c;会将结果存储为float或double类型&#xff0c;但在图像显示时&#xff0c;一般要求图像为 unsigned char 类型,…

在跨平台开发环境中构建高效的C++项目:从基础到最佳实践20241225

在跨平台开发环境中构建高效的C项目&#xff1a;从基础到最佳实践 引言 在现代软件开发中&#xff0c;跨平台兼容性和高效开发流程是每个工程师追求的目标。尤其是对于 C 开发者&#xff0c;管理代码的跨平台构建以及调试流程可能成为一项棘手的挑战。在本文中&#xff0c;我…

网络协议入门

一、概述 1、模型 为了减少协议设计的复杂性&#xff0c;大多数网络模型均采用分层的方式来组织。每一层都有自己的功能&#xff0c;就像建筑物一样&#xff0c;每一层都靠下一层支持。每一层利用下一层提供的服务来为上一层提供服务&#xff0c;本层服务的实现细节对上层屏蔽…

集成RabbitMQ+MQ常用操作

文章目录 1.环境搭建1.Docker安装RabbitMQ1.拉取镜像2.安装命令3.开启5672和15672端口4.登录控制台 2.整合Spring AMQP1.sun-common模块下创建新模块2.引入amqp依赖和fastjson 3.新建一个mq-demo的模块1.在sun-frame下创建mq-demo2.然后在mq-demo下创建生产者和消费者子模块3.查…

sentinel笔记10- 限流规则持久化(下)

上一篇整理过单向的持久化&#xff0c;sentinel笔记9- 限流规则持久化&#xff08;上&#xff09;-CSDN博客 本篇进行sentinel 改造&#xff0c;实现双向同步。 1 下载Sentinel源码 https://github.com/alibaba/Sentinel 2 dashboard 改造 2.1修改dashboard项目的pom.xml &…