问答文章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
长期胃胀怎么调理 魔渊之刃弓箭手攻略 弓箭手法盘装备发育攻略 妻妾迎新送死,倏恩倏爱,倏痛倏悲,缠绵不了是什么意思? 请学过美术或者动漫游戏设计的人回答我的问题。 画一个穿着和头型都相 ... ...和“我有一个可爱并且很淘气的女儿”用英文怎么说 “如果你叫我回答这个问题就是浪费时间,希望老师能找下一个学生”有英 ... 加勒比海盗拍了几部 《加勒比海盗5》第四部女主或回归 与开花同框 购买佳能相机开出的正式发票是佳能公司统一的发票还是各销售公司自己... ...我想早点上美国陪他,请问现在可以办旅游探亲证吗? 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天 还能回来吗? 我在微信上被诈骗了,被盗了怎么办? 白虎是什麽方位 白虎位置在家里什么方向? 经典冷笑话短句子