变参函数剖析

Linux——shell变量及参数 1. 本地变量 本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。 [root@master ~]# ps PID TTY TIME CMD 75643 pts/0 00:00:00 bash 75742 pts/0 00:00:00 ps [root@master ~]# A=hello [root@master ~]# echo $A hello [root@mast... 阅读详情

变参函数定义形式如func(type a, …),要求至少一个固定参数,因为需要通过这个参数来确定究竟有多少个参数、以及参数的类型。

windows中,变参函数用来获取参数的几个宏定义如下。

typedef char *  va_list;
#define _ADDRESSOF(v) (&(v))
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))
#define va_start(ap,v) (ap=(va_list)_ADDRESSOF(v)+_INTSIZEOF(v))
#define va_arg(ap,t) (*(t*)((ap+=_INTSIZEOF(t))-_INTSIZEOF(t)))
#define va_end(ap) (ap=(va_list)0)
_ADDRESSOF的作用是获取数据的地址,_INTSIZEOF是获取指定类型数据按照int类型对齐的空间大小,va_start就是根据第一个参数来获取第二个参数,va_arg是根据当前参数获取第二个参数。通过这种方法能获取到参数的原因是参数是从右到左依次压入栈的,并且栈是从高地址向低地址生长的,这两个条件决定了可以使用这种方法获取参数。


如上图所示,当调用func(a, b, c, d, e, f, g, h)时,参数会从高地址向低地址压入参数,参数是从右向左的顺序压栈的,第一个参数的地址加上第一个参数的大小便得到了第二个参数的地址,以此类推便可以得到各个参数的地址。

c:变参函数:汇编解析;va_list;marco 宏:__VA_ARGS__ 宏定义:使用的时builtin_va_end 宏定义。使用到了下列内置函数来实现va-start、end、arg相关的宏。static rtx。 阅读详情

相关推荐

群晖存储空间损毁不等于硬盘损坏:排查与修复实战

NAS存储系统中,物理硬盘、存储池与文件系统空间构成层级结构,任何一层出现异常都可能在管理界面汇总为“存储空间损毁”。事实上,异常断电、卷未正常挂载等软性问题也会触发这一红色告警,而存储池和硬盘SMART状态往往完全正常。理解这一机制后,用户无需急于格式化重建,通过事件日志审查、SSH确认挂载状态,再借助btrfs scrub等文件系统自愈工具,即可在数据不丢失的前提下恢复存储空间正常。该方案对家庭及小型办公环境中的群晖NAS尤其适用,特别是在供电不稳或硬盘休眠频繁的场景下,能有效规避误判风险。本文完整记录

weixin_30843121的博客 260

shell脚本中的变量及变量传参详解

shell脚本中的变量及变量传参 1、变量的定义 变量本质上就是一片内存区域的地址即寻址符号的别名,当我们运行shell脚本时命令无法操作一直变化的目标,所以需要引入变量来解决此问题,即用一串固定的字符来表示不固定的目标。 2、shell脚本中变量的定义方法 在定义变量时,变量名称中可包含的字符有字母、下划线_和数字,变量名称不能以数字开头,一般在定义变量时我们建议变量名称短全用大写字符 变量名称长用_区分子类 WESTOS Westos_Linux westoS_Linux 环境级别 export a=

weixin_44310047的博客 7523

AI 赋能测试全生命周期:多 Agent 协同的自动化提效方案

本文提出了一种基于Coze平台的多Agent协同测试解决方案,旨在解决软件测试中PRD解析不清晰、测试点覆盖不全、用例编写效率低、代码生成耗时等痛点。通过PRD优化、测试点生成、测试用例生成和单元测试框架生成四个Agent的协同工作,结合Cursor工具实现从需求到代码的全链路自动化。以电商平台登录模块为例,展示了从模糊PRD到标准化测试用例和可执行Java单元测试代码的完整转化流程。该方案通过AI赋能显著提升测试效率,减少人工干预,实现测试覆盖率≥95%,为快速迭代的软件研发提供了高效的测试自动化支持。

QINJIEEE的博客 1099

sed -i 命令详解

# 对每行匹配到的第一个字符串进行替换 sed -i 's/原字符串/新字符串/' ab.txt # 对全局匹配上的所有字符串进行替换 sed -i 's/原字符串/新字符串/g' ab.txt # 删除所有匹配到字符串的行 sed -i '/匹配字符串/d' ab.txt # 特定字符串的行后插入新行 sed -i '/特定字符串/a 新行字符串' ab.txt # 特定字...

yn 6万+

UFS Write Booster技术解析:原理、配置与故障排查实战

在存储技术领域,缓存机制是提升I/O性能的核心手段之一,其原理是通过高速存储介质暂存数据,减少对低速主存储的直接访问,从而降低延迟、提升吞吐。Write Booster正是这一原理在UFS(通用闪存存储)规范中的具体实现,它通过引入独立的易失性高速缓存区(Write Booster Buffer),将主机写入命令快速响应与后台数据持久化分离,技术价值在于显著改善随机写入性能,消除由垃圾回收等后台操作引发的写入卡顿。该技术广泛应用于智能手机应用安装、相机连拍、固件升级(OTA)等对写入流畅性要求高的场景。本文

weixin_42561143的博客 356

SOLIDWORKS转CAD字体终极选择:TrueType vs SHX,哪个才是你图纸协作的“安全牌”?

本文深入探讨SOLIDWORKS转CAD工程图中的字体选择问题,对比TrueType与SHX字体在DWG文件协作中的表现。通过真实案例揭示字体映射的兼容性陷阱,提供企业级字体管理方案,帮助工程师规避版本差异、系统依赖和法律风险,确保图纸协作的稳定性。

weixin_34233974的博客 264

C编译器剖析_C语言的变参函数

C语言的变参函数     UCC编译器中有不少地方使用了C语言的变参函数,这里我们专门用一小节来对C语言变参函数的实现原理进行分析。C标准库中的printf函数就是一个典型的变参函数,其接口如下所示,函数声明中的省略号…表明这是一个变参函数。          int printf(const char *format, ...);     下面我们举一个简单的例子来说明printf函数的调

SheIsC的专栏 2106

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 381

如何理解printf变参函数的实现

距离2011年写Linux应用程序之Helloworld入门都10年多了。相信只要有点C语言基础或者瞄过一眼C语言的朋友,对于这段代码是非常之熟悉,估计能倒背如流吧。C语言教学的时候,有一个章节是专门学习如何声明函数,参数(传值,传址),返回变量等。学完那个章节,不知道是否有同学问过:这个printf是怎么声明和定义的嘛? 2.2 Linux Man page解释 2.3 标准C库解释 【1】cplusplus.com/reference/cstdio 【2】tutorialspoint.com/c_st

lida2003的专栏 1391

Allegro技巧----相同模块复用实现快速布局

使用Allegro软件进行PCB Layout设计时,当电路图中有很多路相同的模块,使用模块复用的的操作方法,可以显著提高工作效率,同时也可以使PCB布局在整体上显得美观。 如图,有8个相同的ADC采样电路模块,它们在原理图中的电路也是一样的,对于这多个相同的电路模块,如果一个个元器件布局很明显做了很多重复机械的劳动,效率低下;但是强大的Allegro软件早就考虑到了这点,只需要在PCB中做好其中的一个,则其余相同的模块通过复用的方式,可以快速完成,方便省事还美观。 具体步骤: 1.首先完成一个模块的PC

sinat_15677011的博客 5655

五十天精通硬件设计第6天-放大器知识及选型

运算放大器(Operational Amplifier,简称运放)是一种高增益的直流耦合差分放大器,广泛应用于信号处理、滤波、比较、积分、微分等电路中。

whm128的博客 592

基于ENVI完成影像的去云操作以及后续处理

利用ENVI完成重采样影像的去云操作 由于SNAP重采样之后的影像是分波段保存的,ENVI的波段运算工具一次也只能输出一个波段,所以去云的操作分波段进行,原理是掩膜法 下面是打开所有波段后的界面 去云的依据是以quality_scene_classification栅格文件为基础,该文件是哨兵2数据自带的场景质量分类图,包含12个级别,可以通过SNAP软件查看,如下图所示: 对于去云操作而言,我们只需要DARK_FEATURE_SHADOW(地形等),CLOUD_SHADOW(云阴影)、CL

lemon_tttea的博客 2万+

printf打印函数的原理浅析

printf的底层原理浅析 前言   最近在学习linux内核的时候用到了自定义实现的printf,学习了一下,在此记录,希望有助于大家。   在C语言中,我们用到的最多的输出功能函数大概就是printf了。但以前只是调用C语言的库函数,具体printf是如何实现的呢? 说到底两件事: (1)、函数变参 (2)、格式解析   下面将简要介绍以上两点内容,最后附一个简单的printf例子。 函数变参...

xiaopan的博客 7335

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++变参模板:从语法到实战,掌握现代C++泛型编程利器

泛型编程是现代C++的核心思想之一,旨在编写可复用、类型安全的通用代码。其原理是通过模板实现代码与数据类型的解耦,让同一套逻辑能处理多种数据类型。这一技术价值在于极大提升了代码的复用性和可维护性,减少了冗余。在应用场景上,泛型编程广泛用于容器库、算法库、工厂模式等需要处理不确定类型或数量参数的场合。本文聚焦于C++11引入的变参模板,它正是泛型编程的高级形态,允许函数或类模板接受任意数量和类型的参数。通过深入解析其核心语法、递归与折叠表达式两种处理方式,并结合完美转发、元组实现等实战案例,帮助开发者掌握这一

weixin_33806859的博客 312

精雕软件(JDpaint) 5.5 绿色版

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

C语言的重载——变参函数

变参函数就是丐版重载

六个九十度 204

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

取绝对值函数图像怎么画_三次函数图像解,换元构造绝对值——2019年浙江卷第16题赏析...

今年6月份我们做了一件有意义的事,至少我们是这样认为的。我们将2019年的13套高考试卷的全部压轴题进行了深入剖析,一题多解。今天带来的是浙江卷填空压轴的倒数第二题。编校:浙江嘉善桂建军绘图:浙江义乌李耀华解法一:三次函数图像法解题教师:浙江杭州吴应富解法二:存在性问题使用参变分离法转化为函数最值解题教师:浙江绍兴戴刚锋、浙江嘉善桂建军、浙江丽水代云龙解法三:换元构造绝对值函数评论与赏析...

weixin_42302026的博客 418

c++ onmousemove函数显示绝对坐标_一入函数深似海,从此数学是路人!含参最值问题,九张动图解忧愁...

“一入函数深似海,从此数学是路人”很多同学都有这样的感觉。问:数学是从什么开始听不懂了?答:学函数的时候。函数问题作为中学阶段数学重要的知识点,真的是难倒了很多同学。数学老师也非常的痛苦,每次讲完函数问题,看到大家一脸茫然的表情,都会狠狠心再讲一遍,可结果却是听懂的同学已经明白了,没听懂的同学还是在迷糊。同学们对于函数最常见的问题这个函数动起来到底是什么样子?对于含参数的函数,为什么要在这里讨论?...

weixin_39664010的博客 182

Go 语言中常见的几个“陷阱”

陷阱关键点修复方案range修改无效range返回副本变参未展开a是[]T,非参数列表调用时加...f(a...)Slice 意外共享slice 是底层数组的 view独立副本用掌握这些细节,能大幅减少“为什么没生效?”的 debug 时间。Go 的设计哲学是“显式优于隐式”,理解其内存模型是写出健壮代码的关键。📢 欢迎在评论区分享你遇到的其他 Go Gotchas!

weixin_44058951的博客 812

常用技巧

1.define中的#和## #是将后面的内容进行串化; ##是连接两串字符,形成新的字符串; 详见https://zhidao.baidu.com/question/425382312987430932.html 2.二级串化,可以将数字宏定义转化为字符串,详见: http://blog.youkuaiyun.com/happen23/article/details/50602667

太陽の金貨 的博客 220

C++变参模板:从核心原理到工程实践,掌握现代C++泛型编程利器

泛型编程是现代C++的核心范式之一,它通过模板技术实现类型无关的通用算法和数据结构。其核心原理是在编译期进行类型推导和代码生成,从而在保证类型安全的同时消除运行期开销。这一技术价值在于能够构建高度可复用、性能优异的组件库,广泛应用于基础库开发、游戏引擎、高频交易系统等对性能和抽象能力要求极高的领域。其中,变参模板作为C++11引入的关键特性,解决了编写真正通用、类型安全且能处理可变数量参数代码的核心痛点。通过参数包、包展开和折叠表达式等机制,开发者可以优雅地实现类型安全的格式化输出、通用工厂函数等实用功能,

weixin_31960565的博客 274

C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义

摘自 http://zhidao.baidu.com/link?url=fRkRC7pwXJ4DfhP3Vuf9AWyUE2Tidsm_0YWCctcZUH5_yFy8oq_1sKi-4UySEQdB38h9Lna6qNJcYPEcZ7TYRa #include // 必须包含的头文件 int Add(int start,...) // ...是作为占位符 { va_l

qq546770908的专栏 604

ARM AAPCS规约下的函数调用博弈:sprintf与栈对齐的深层对话

本文深入解析ARM AAPCS规约下栈对齐机制,特别是sprintf变参函数如何成为8字节对齐的严格检查者。分析浮点数格式化错误根源,揭示中断与多任务环境中的对齐陷阱,并提供从编译器配置到代码规范的实战解决方案,保障嵌入式系统稳定性。

book8的博客 786
上一篇: 二叉树中节点的最大距离
下一篇: 函数调用约定
notishell
博客等级 码龄15年 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值