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

C++ Reference: Standard C++ Library reference: C Library: cstdarg: va_arg

C++官网参考链接:https://cplusplus.com/reference/cstdarg/va_arg/


<cstdarg>
va_arg
type va_arg (va_list ap, type)
获取下一个实参 
这个宏展开为一个类型为type的表达式,其中包含由ap标识的可变实参列表中的当前实参的值。
对该宏的每次调用都会修改ap的状态,以便下一次对该宏的调用将展开到它计算结果的实参之后的实参。
注意,va_arg不能确定传递给函数的实参的实际类型,而是使用作为type宏实参传递的任何类型作为其类型。
还要注意,va_arg也不确定检索到实参是否是传递给函数的最后一个实参(甚至也不确定它是否是超出列表末尾的元素)。函数应该这样设计:可以通过指定命名形参的值或已经读取的附加实参的值以某种方式推断形参的数量。

参数
ap
类型为va_list的对象携带关于可变实参列表的当前检索状态的信息。该对象应该通过对va_start或va_copy的初始调用进行初始化,而且还没有用va_end释放。
type
一个类型的名字。此类型名用作此宏展开到的表达式的类型(即其返回类型)。要使类型表达式适合与va_arg一起使用,必须使type*产生指向type的指针。类型必须与提取的实参的类型兼容(按照默认实参提升的方式提升),或者一个是另一个的无符号版本,或者一个是void指针,另一个是其他指针类型。

返回值
返回当前附加实参作为类型type的表达式。 

用例
/* va_arg example */
#include <stdio.h>      /* printf */
#include <stdarg.h>     /* va_list, va_start, va_arg, va_end */

int FindMax (int n, ...)
{
  int i,val,largest;
  va_list vl;
  va_start(vl,n);
  largest=va_arg(vl,int);
  for (i=1;i<n;i++)
  {
    val=va_arg(vl,int);
    largest=(largest>val)?largest:val;
  }
  va_end(vl);
  return largest;
}

int main ()
{
  int m;
  m= FindMax (7,702,422,631,834,892,104,772);
  printf ("The largest value is: %d\n",m);
  return 0;

这个FindMax函数的第一个形参是它将获得的附加实参的数量。检索第一个附加实参并将其用作比较的初始引用,然后在循环中检索其余附加实参并进行比较以返回最大的一个(在本例中为892)。
输出:

另请参考
va_start    Initialize a variable argument list (macro) (初始化一个可变实参列表(宏)) 
va_end    End using variable argument list (macro) (结束使用可变实参列表(宏)) 
va_list    Type to hold information about variable arguments (type) (保存关于可变实参信息的类型(类型)) 
vsprintf    Write formatted data from variable argument list to string (function) (从可变实参列表写入格式化数据到字符串(函数))

相关文章:

  • Eclipse技巧(一):快速定位文件的层级位置 | 快速查找文件在工程根目录的位置
  • 汇编笔记[04][内存寻址方式]
  • 开发行业门槛越来越高,Android 开发者的未来之路到底在哪里?
  • Java如何为函数定义一个可变长度的参数呢?
  • 【数字设计】哲库科技_2023届_笔试面试题目分享
  • Java中this关键字的相关说明
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • ARM 指令流水线
  • 天冷就要大口吃肉肉~python采集周边烤肉店数据【附代码】
  • 网络地址转换(NAT)(二)
  • 【目标检测】56、目标检测超详细介绍
  • 【PyTorch深度学习项目实战100例】—— 基于RNN实现微博热点新闻分类 | 第27例
  • 05_移动端网页适配
  • Hive数据库操作
  • python 矩阵运算
  • [NodeJS] 关于Buffer
  • [Vue CLI 3] 配置解析之 css.extract
  • JWT究竟是什么呢?
  • mysql 5.6 原生Online DDL解析
  • passportjs 源码分析
  • React16时代,该用什么姿势写 React ?
  • Spring Cloud中负载均衡器概览
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue UI框架库开发介绍
  • 编写符合Python风格的对象
  • 汉诺塔算法
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 强力优化Rancher k8s中国区的使用体验
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 移动端高清、多屏适配方案
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)(1.11) SiK Radio v2(一)
  • (ZT)薛涌:谈贫说富
  • (规划)24届春招和25届暑假实习路线准备规划
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原)本想说脏话,奈何已放下
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转) ns2/nam与nam实现相关的文件
  • (转)甲方乙方——赵民谈找工作
  • *2 echo、printf、mkdir命令的应用
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .naturalWidth 和naturalHeight属性,
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .so文件(linux系统)
  • @EnableWebMvc介绍和使用详细demo
  • [CLR via C#]11. 事件
  • [codevs 1515]跳 【解题报告】