问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++ 变长参数列表

发布网友 发布时间:2022-05-14 17:04

我来回答

2个回答

热心网友 时间:2023-07-28 22:23

在C编译器通常提供了一系列处理可变参数的宏,实现就像printf()那样的变长参数列表,这样可以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、 va_arg和va_end等,这些宏都是在头文件<stdarg.h>里定义的。
采用ANSI标准形式时,参数个数可变的函数的原型声明是:
type funcname(type para1, type para2, ...)
这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type是函数返回值和形式参数的类型。
不同的编译器,对这个可变长参数的实现不一样 ,gcc4.x中是采用内置函数的方法来实现。

接下来我们看看以下示例代码:
#include <stdarg.h>
#include <stdio.h>

int Sum (int n, ...)
{
int sum = 0, i = 0;
va_list p; // 定义一个变量 ,保存函数参数列表的指针。
va_start(p, n); // 用va_start宏初始化变量p,
// va_start宏的第2个参数n,
// 是一个固定的参数,
// 必须是我们自己定义的变长函数的最后一个入栈的参数,
// 也就是调用的时候参数列表里的第1个参数。

for (i = 1; i < n; ++ i) // i从1开始,遍历所有可变参数。
{
sum += va_arg(p, int); // va_arg取出当前的参数,
// 并认为取出的参数是一个整数(int) 。
}
return sum;
}

int main(void)
{
int num;
num = Sum(5, 1, 2, 3, 4);
printf("%d\n", num);
return 0;
}

当我们调用Sum函数时,传递给Sum函数的参数列表的第一个参数n的值是5,va_start 初始化p使其指向第一个未命名的参数(n是有名字的参数) ,也就是1(第一个),每次对 va_arg的调用,都将返回一个参数,并且把 p 指向下一个参数,va_arg 用一个类型名来决定返回的参数是何种类型,以及在 var_arg的内部实现中决定移动多大的距离才到达下一个参数。

热心网友 时间:2023-07-28 22:23

这样定义是不行的,要使用参数可变的函数的话,必须有一个命名的参数。
必须这样定义 void func( int iArgCount, ... );
一般使用参数个数可变的函数,最后一个明确的参数一般定义为可变参数的个数。同时必须包含头文件<stdio.h>和<stdarg.h>

给你个完整的例子吧
#include <stdio.h>
#include <stdarg.h>

void func( int iCount, ... );

void func( int iCount, ... )
{
va_list ArgList; //定义可变参数列表
int i = 3;

va_start( ArgList, iCount ); //确定可变参数的起始位置,iCount后的参数就是可变参数了

int arg1 = va_arg( ArgList, int ); //取下一个参数
int arg2 = va_arg( ArgList, int );
int arg3 = va_arg( ArgList, int );

cout<<arg1<<endl;
cout<<arg2<<endl;
cout<<arg3<<endl;

va_end( ArgList );
}

int main()
{
func(3,0,1,2);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
今天收到一个快递,是吃的,马卡龙,没有任何备注谁送,妈说不能吃可能是... 马卡龙 多久会过期啊 快递要三四个星期还能吃吗。那种现烤的。 网上买的马卡龙,八天了才到,他说用冰袋做了保温措施的,但我觉得应 马卡龙冷冻半年还能吃吗-马卡龙冷冻一年能吃么 Shell 之变量替换 求助Shell中sed命令删除行时引用变量 金立f103otg无反应怎么回事 ...发现振动没有了,是什么原因?我的手机是金立F103 金立f103蓝炫来电不震动 有哪些影视作品是带火了某个国家的旅游的? java参数列表 int...A 与 int[]A 的区别 java,方法的参数列表都可以放什么? 如何获取函数的参数列表,不是命令行参数 C语言中参数列表写在函数名后面的___内 在vb中什么叫“参数表列”? C语言构建函数什么时候必须添加参数列表 谁能解释下C#中的参数列表(能详细就详细)谢谢 参数列表不同是什么意思? 什么是参数列表?代码写好了怎样要C语言编译? - 信息提示 6岁女孩外阴外观看上去一高一低 飞亚达机械表,有一次不走了,修过后,走时好了,但一晃动,手来里翁 华硕显卡DUAL-RTX2060S-A8G-EVO总线标准是多少? 华硕显卡DUAL-GTX1650-4G最多可以支持几个显示器? 华硕显卡DUAL-RX580-4G最多可以支持几个显示器? 请问蓝宝石显卡R9 280X TOXIC、R9 280X Vapor-X、R9 280X Dual-X,哪个性价比更好? 农村信用社办理 定期储蓄存单步骤 蓝宝石R9 280X 3G GDDR5 DUAL-X OC显卡怎么样 我的飞亚达机械表放了一段时间怎么不走了,怎么调也没有用,怎么办 大家在新年里有哪些趣事,拜托告诉我! 如何注册一个不用手机号 无需手机号怎么注册? 怎么不用手机号注册一个新的 怎么注册不用手机号 不用手机号怎么申请注册新账号 大蒜放醋里可以放多久 商标名注册要求及相关疑问 醋里可以放大蒜吗 醋里面放一点大蒜是不是醋不容易坏 把蒜放在醋里会变绿,为什么? AS3.0中如何用代码画直线影片剪辑 畅想一下,物联网高级时代是什么场景,提示:增加AI 智慧工业,智慧农业,智慧物流,智慧地球哪一个不属于物联网十二五规划包括_百度问一问 如何用物联网数据来构建工业智能 头发很干没光泽应该多吃什么? 微信诈骗被封了15天 还能回来吗? 我在微信上被诈骗了,被盗了怎么办? 白虎是什麽方位 白虎位置在家里什么方向? 经典冷笑话短句子