C/C++和C#中的不定参数

本文详细探讨了C#和C/C++中处理不定参数的方法。在C#中,`params`关键字用于创建可变参数列表,实际是通过数组传递并使用`ParamArrayAttribute`。而在C/C++中,不定参数通过`va_list`,`va_start`,`va_arg`等宏来处理,实现从函数调用栈中获取参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

C#中的params

首先,在C#中,我们一般是使用params关键字来处理不定参数的问题,对于params的用法这里不再赘述。
我们先来写一小段测试代码来看看C#中params是如何运作的:
在这里插入图片描述
我们使用ILSpy来进行反编译,得到它的IL代码:
ArrayTest的IL代码
ParamsTest的IL代码
由上图我们可以看到,ParamsTest和ArrayTest的参数都是一个int32的数组,并没有任何区别,ParamsTest只比ArrayTest多了如下IL代码:
在这里插入图片描述
可以看到,这里使用了一个param[1]指令,对于param的作用,一直没怎么找到,最后在Common Intermediate Language(CIL)的wiki(https://en.wikipedia.org/wiki/Common_Intermediate_LanguageReferences )的References里的ECMA文档(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf )中找到了解释:
在这里插入图片描述
这里可以看到,param[0]是在取得函数的返回值,param[1]取得函数的第一个参数、param[2]取得第二个参数,以此类推。
然后调用了一次ParamArrayAttribute的构造器,查看微软给出的文档:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值