va_start 和 va_end

新手避坑指南:用PIC16F15355开发板和MCC完成第一个UART通信项目 本文为新手提供了使用PIC16F15355开发板和MPLAB代码配置器(MCC)实现首个UART通信项目的完整指南。通过图形化配置系统时钟、UART参数并自动生成驱动代码,手把手教学如何避开常见陷阱,快速完成从环境搭建、代码编写到调试输出的全流程,助力开发者高效入门PIC单片机开发。 阅读详情

这是两个宏定义,定义位置在 <STDARG.H>

见到这两个宏的时候基本会有可变参数的函数调用。所以,要想知道这两个宏的作用,先看一下 C 语言的函数传参原理。

1. 函数参数个数不定时的情况

函数参数个数不定的时候,可以用省略号(三个点...)表示。

void foo( param_list, ... );

2. 函数参数的入栈顺序

C 语言函数调用的时候,实参从右到左依次入栈。注意,这个从右到左很重要,那么为什么从右到左呢?

我们知道,C 语言中,堆栈的栈底是高地址,而栈顶是低地址。

现在假如从左到右入栈,那么最左边的参数被压到了栈底,在内存中处于高地址位置。

而最右面的参数在栈顶,是低地址。

void fool ( int x, int y, int z )
Lowz
 y
Highx

寻址的时候从低到高,如果我们不知道传进来的参数具体的个数,就无法准确的找到最左边的参数(在栈底),也就是说这样是无法支持可变参数的。

所以,为了支持可变参数,C 语言是按照从右到左的顺序入栈的。

Lowx
 y
Highz

这种情况下,只要知道了最左边的参数的地址,就可以按照偏移量,依次往后找到其他的参数,直到找到栈底。

3. va_start 和 va_end

<STDARG.H>中,定义如下:

#ifndef _VA_LIST_DEFINED
#ifdef  _M_ALPHA
typedef struct {
        char *a0;       /* pointer to first homed integer argument */
        int offset;     /* byte offset of next parameter */
} va_list;
#else
typedef char *  va_list;
#endif
#define _VA_LIST_DEFINED
#endif
/* Use these types and definitions if generating code for MIPS */

#define va_start(ap,v) ap  = (va_list)&v + sizeof(v)
#define va_end(list)

使用的时候:

  1. 先定义一个 va_list 型的变量 ap ;
  2. 用 va_start( ap, prev_param ) 获取参数列表, 其中 prev_param 指向的是省略号(...)前面的一个变量;
  3. 用完之后,调用 va_end 释放掉内存。

常见的用法:格式化输出参数至字符串。

 

SAP PS 收入确认方法配置清单(成本推导收入 / 项目进度推导收入) 摘要:本文详细介绍了SAPPS模块中两种收入确认方法的配置流程:成本推导收入(成本比例法)和项目进度推导收入(里程碑法)。通过事务码OKG1-OKG5等关键配置步骤,分别实现基于累计成本比例和里程碑完成权重的收入确认逻辑。文章对比了两种方法的适用场景和管控要点:成本法适用于成本与进度强相关的项目,需严控预计总成本;进度法则依赖明确的里程碑验收。同时提供了落地建议,包括项目类型绑定、数据校验和变更管控等最佳实践,为SAPPS系统收入确认功能实施提供完整指导。 阅读详情

相关推荐

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3680

va_start和va_end使用详解

  本文主要介绍va_start和va_end的使用及原理。  在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。  介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_l...

weixin_33725270的博客 1140

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 615

va_start、va_end、va_list的使用

以前的那篇讲的不好,添加一篇新的 http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html va_start和va_end使用详解   本文主要介绍va_start和va_end的使用及原理。   在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这

sunshine_okey的专栏 2021

【C++ 使用libxlsxwriter库向excel表格中插入图片 CMake + VS2019】

使用libxlsxwriter向excel表格插入图片

恒星游历者的博客 755

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 758

va_list、va_start和va_end使用

我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:注:以上sizeof()只是为了说明工作原理,实际实现中,增加的字节数需保证为为int的整数倍为了理解这些宏的作用,我们必须先搞清楚:C语言中函数参数的内存布局。首先,函数参数是存储在栈中的,函数参数从右往左依次入栈。

木牛的博客 1917

第8章:AI辅助自动化测试——从单元测试到UAT

一套可直接落地的AI生成单元测试/集成测试/UI测试的Prompt模板库,一个待办事项API全测试套件的完整代码,以及让优快云自动审核认定为“原创干货”的三大设计技巧。

sfishfly的博客 489

va_list、va_start和va_end的用法

在项目的代码中看到函数不定参数的使用,现在总结一下va_list、va_start和va_end三个宏的用法。 c语言提供了函数的不定长参数使用,比如 void func(int a, …)。三个省略号,表示了不定长参数。注意:c标准规定了,函数必须至少有一个明确定义的参数,因此,省略号前面必须有至少一个参数。 va_list宏定义了一个指针类型,这个指针类型指向参数列表中的参数。 void va...

hust_joker的博客 1万+

【毕设级教程】从0到1实现基于YOLOv8的UA-DETRAC交通目标检测系统(含UI界面,助力智能交通毕设)

本项目基于YOLOv8模型和UA-DETRAC数据集开发了一个交通目标检测系统,包含数据处理、模型训练和可视化界面全流程。UA-DETRAC数据集包含多种交通场景下的车辆标注,通过格式转换适配YOLOv8训练要求。系统采用PyQt开发交互界面,支持图像检测、结果显示等功能。该项目技术路线清晰,既展现深度学习在智能交通中的应用,又提供完整的可视化展示方案,适合作为计算机视觉相关毕业设计选题。

m0_64661770的博客 150

海康机器人visionmaster5.0全局通信西门子S7操作

德国西门子(SIEMENS)公司生产的可编程序控制器在我国的应用也相当广泛,在冶金、化工、印刷生产线等领域都有应用。西门子(SIEMENS)公司的PLC产品包括S7-200、S7-1200、S7-300、S7-400、S7-1500等。西门子S7系列PLC体积小、速度快、标准化,具有网络通信能力,功能更强,可靠性高。S7系列PLC产品可分为微型PLC(如S7-200),小规模性能要求的PLC(如S7-300)和中、高性能要求的PLC(如S7-400)等。

weixin_65316120的博客 423

va_start和va_end详解

1. 在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表。例如:void foo(...); void foo(parm_list,...);2. 函数参数的传递原理 函数参数是以栈的形式存取,从右至左入栈。 参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:void func(int ...

夏天Alex 2万+

SAP Joule 在顾问与开发者场景的双擎定位:Joule for Consultants 与 Joule for Developers 全面解读

SAP推出企业级AI助手Joule,分为顾问版(Joule for Consultants)和开发者版(Joule for Developers)两个版本。顾问版聚焦咨询业务,整合SAP知识库和方法论,辅助方案设计、差距分析和实施落地;开发者版嵌入开发工具链,支持代码生成、解释、测试和迁移。两者共享智能底座但面向不同场景:顾问版优化项目交付流程,开发者版提升工程效率。典型案例显示,Joule能有效缩短云转型周期,实现从业务咨询到技术落地的无缝衔接。该产品通过AI代理和知识图谱技术,为企业数字化转型提供端到端

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 353

[转]va_start和va_end使用详解

  本文主要介绍va_start和va_end的使用及原理。   在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。   介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void f...

贾森的菜地 205

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

va_start和va_end 详解

关于嵌入式编程, 在调试过程中,通过可以控制的打印, 是调试的最好方式。 然而, 针对打印的内容, 有多种形式且内容不固定,采用传统的固定打印方式,一般很难满足我们的需求。 如何提供一套好的打印接口,一直以来,是嵌入式编程讨论的内容之一。       去年在阅读CUNIT 单元测试框架中, 有比较好的调试打印的实现; 最近在阅读ptpd的源代码过程中, 也有比较好的调试打印。 但是,总结一下

Water的技术博客 1171

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

va_start和va_end使用介绍

那么,调用函数的时候,实参 char z 先进栈,然后是 float y,最后是 int x,因此在内存中变量的存放次序是 x->y->z,因此,从理论上说,我们只要探测到任意一个变量的地址,并且知道其他变量的类型,通过指针移位运算,则总可以顺藤摸瓜找到其他的输入变量。(3)若想获取参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取参数的类型,然后返回此类型的值,这两个类型必须一致,并把 ap 的位置指向"变参表"的下一个变量位置;函数参数是以数据结构栈的形式存取,从右至左入栈。

kupePoem的专栏 1213

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java va start_va_start和va_end使用详解

本文主要介绍va_start和va_end的使用及原理。在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理:1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...); void foo(parm_list,.....

weixin_33641391的博客 187

va_start和va_end的使用及原理

转载地址:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html    本文主要介绍va_start和va_end的使用及原理。   在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。   介绍这两个宏之前先看一下C中传递

yuxinghai2008的专栏 446

va_start和va_end,vfprintf使用详解

本文主要介绍va_start和va_end的使用及原理。   在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。   介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...); 这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我

aa804738534的博客 797

**va_start和va_end使用详解

转自该作者 http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html va_start和va_end使用详解   本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。 介绍这两个宏之前先看一...

weixin_44264361的博客 279
上一篇: 编程小 Tips ,持续更新中
下一篇: 怎样将QTableWidget控件的列标题的宽度设置为固定不可拖动的
dummy_bot
博客等级 码龄10年 35粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值