【trt_infer】 日志

news/2024/10/20 1:19:49/

C++ 可变长参数

参考:

  • https://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html

1. C/C++语言中函数传递参数时的基本原理

在C/C++中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表如:

void foo(...);
void foo(pram_list, ...);

参数存放在内存的堆栈段中,在执行函数的时候,从最后一个入栈,因此栈底高地址,栈顶低地址。如:

void func(int x, float y, char z);

调用函数是,实参 z 先入栈,因此在内存中变量的存放顺序为 x, y, z. 因此理论上说:只要探测到任意一个变量的地址,并且知道其他变量类型,通过指针移位操作,可以找到其他所有的输入变量

2. 可变长参数相关宏

2.1 导入头文件:

#include <stdarg.h>

2.2 相关宏定义:

typedef char* va_list;
void va_start(va_list ap, prev_param); /*ANSI version*/
type va_arg(va_list ap, type);
void va_end(va_list, ap);
  • va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。

2.3 可变长参数读取的一般步骤

  • 在调用参数表之前,定义一个 va_list 类型的变量。
va_list ap;
  • 对ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数时在变参表前面紧挨的一个变量,即 “…” 之前的第一个参数。
// void foo(int arg1, int arg2, ...)
va_start(ap, arg2);
  • 获取参数。调用 va_arg, 它的第一个参数是 ap ,第二个参数是要获取参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置。
char para = va_arg( argp, char);
  • 关闭 ap 指针。 在获取所有的参数之后,有必要将这个 ap指针关掉,以免发送危险。
void va_end ( va_list ap );

一个完整的案例:

#include <iostream>
#include <stdarg.h>
std::string format(const char* fmt, ...) {va_list vl;va_start(vl, fmt);char buffer[2048];vsnprintf(buffer, sizeof(buffer), fmt, vl);va_end(vl);return buffer;
}void printArgs(int arg1, ...)
{va_list args;va_start(args, arg1);int value = arg1;while (value != -1){std::cout << value << " ";value = va_arg(args, int);}va_end(args);
}int main()
{printArgs(1, 2, 3, 4, 5, -1);std::cout << format("rst: %s %d", "ans:", 1) << std::endl;std::cout << format("rst: %s %d", "ans:", 2) << std::endl;std::cout << format("rst: %s %d", "ans:", 2) << std::endl;std::cout << format("rst: %s %d", "ans:", 3) << std::endl;return 0;
}
  • 输出:
1 2 3 4 5 
rst: ans: 1
rst: ans: 2
rst: ans: 2
rst: ans: 3

3. 可变长参数宏

先看一组常见的日志输出的宏:


#define INFOD(...)		iLogger::__log_func(__FILE__, __LINE__, iLogger::LogLevel::Debug, __VA_ARGS__)
#define INFOV(...)		iLogger::__log_func(__FILE__, __LINE__, iLogger::LogLevel::Verbose, __VA_ARGS__)
#define INFO(...)		iLogger::__log_func(__FILE__, __LINE__, iLogger::LogLevel::Info, __VA_ARGS__)
#define INFOW(...)		iLogger::__log_func(__FILE__, __LINE__, iLogger::LogLevel::Warning, __VA_ARGS__)
#define INFOE(...)		iLogger::__log_func(__FILE__, __LINE__, iLogger::LogLevel::Error, __VA_ARGS__)
#define INFOF(...)		iLogger::__log_func(__FILE__, __LINE__, iLogger::LogLevel::Fatal, __VA_ARGS__)

调用方式:

INFOD("this is a log : %d %d %d", 1,2,3);
  • 此处的 __VA_ARGS __ 为可变参数的内容,可以传递到可变长函数中。

http://www.ppmy.cn/news/44069.html

相关文章

MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合-图像识别(论文篇三)

目录 基于多尺度特征融合的眼底图像分割算法研究 相关理论知识及技术 2.1 眼底医学图像知识

MySQL SQL优化 【建议熟读并背诵】

插入数据 批量插入数据 insert into tb_test values(1,Tom),(2,Cat),(3,Jerry);手动控制事务 start transaction; insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); insert into tb_test values(4,Tom),(5,Cat),(6,Jerry); insert into tb_test values(7,Tom),(8,Cat…

别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有

断言 断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert 断言工具类&#xff0c;通常用于数据合法性检查 // 要求参数 object 必须为非空&#xff08;Not …

[ 云计算 | Azure ] Chapter 04 | 核心体系结构之数据中心、区域与区域对、可用区和地理区域

本章节主要内容进行讲解&#xff1a;Azure云计算的核心体系结构组件中的&#xff1a;Azure物理基础设施&#xff08;Physical infrastructure&#xff09;&#xff0c;区域&#xff08;Regions&#xff09;和区域对&#xff08;Region Pairs&#xff09;、地理数据中心&#xf…

spring面试

mybatis:1 类型转换器BaseTypeHandlerMappedJdbcTypes2 #和$的区别# 占位符会进行预编译$ 连接符号,不会进行预编译,原样拼接Spring##AOP##1 AOP :jkd的动态代理,cglib动态代理2 Aspect切面类,通知类:前置通知,后置通知,返回后,返回异常后,环绕Before 前置After 后置AfterRetu…

企业网站架构LAMP部署与优化(apache、mysql、php)

目录LAMP概述与简介编译安装Apache http服务1、关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt/apache目录下2、在opt/apache目录下安装http所需软件包3、解压以下文件4、将解压的两个文件移到相应目录5、安装环境依赖包6、配置软件模块7、编译安装8、优化配置文件路径…

MATLAB R2020a介绍

MATLAB R2020a介绍MATLAB R2020a安装包MATLAB计算与常用命令MATLAB R2020a安装过程1、MATLAB R2020a 的介绍2、MATLAB R2020a 的特点3、MATLAB R2020a 的功能4、MATLAB R2020a 快捷键MATLAB R2020a安装包 链接&#xff1a;https://pan.baidu.com/s/1nNJq-NozNBMOufhM3wiIZQ 提取…

【微信小程序】-- 分包 - 独立分包 分包预下载(四十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…