可变参数问题

jfsaka 2008-02-25 12:38:06
有这样一个函数原型:
void show(string RItem,string item,...)

其中需要调用函数show("Version","url"),以及show("Version","Server",2);
就是需要接收一个可变int型参数,我是这样写的,可是问题出在当没有可变参数时,函数也输出了一个值,问题时不知道该怎么判断可变参数的个数?
int main()
{
show("Version","updata_url");
show("Version","Server IP",2);
return 0;
}

void show(string RItem,string item,...)
{
va_list ap;
va_start(ap,item);
int i=va_arg(ap,int);
cout <<RItem<<endl;
cout <<item<<endl;
cout <<i<<endl;
va_end(ap);
}
...全文
185 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuegao007 2008-02-29
  • 打赏
  • 举报
回复
void show(string RItem,string item,...)
{
va_list ap;
va_start(ap,item);
int i=va_arg(ap,int);
cout <<RItem<<endl;
cout <<item<<endl;
cout <<i<<endl;
va_end(ap);
}
第一个参数RItem不是属于可变参数的,和后面的参数不一样,他可以随便写的。只是后面的参数是从RItem的地址往后分配。你可以用Ritem表示参数个数,
for(int i=0; i<Ritem; i++)
{
cout<<va_arg(ap, int);
}
当然你也可以用别的方法的
jfsaka 2008-02-28
  • 打赏
  • 举报
回复
感谢楼上的回复,可是这样也解决不了问题啊,read_xml(string server,string configuration,string ip,...),后面可能会有user_name,user_ID等项,参数默认也是不行的,后面的可变参数其类型有int ,string等,我看过printf的函数,它是用"%",来控制参数的个数的
iambic 2008-02-28
  • 打赏
  • 举报
回复
把你的所有参数包装在一个对象里面。
sunkaidong 2008-02-28
  • 打赏
  • 举报
回复
学习中
白乔 2008-02-27
  • 打赏
  • 举报
回复
使用va_xxx宏

我在那本《标准C++开发入门与编程实践》上具体的例举过
redleaves 2008-02-27
  • 打赏
  • 举报
回复
重载解决不了,再加点模板...
ShardowM 2008-02-27
  • 打赏
  • 举报
回复
学习
大前置 2008-02-27
  • 打赏
  • 举报
回复
方法1:重载

方法2:参数默认
void show(string RItem,string item,int i=0)

以下都能调用上面的函数:
show("Version","updata_url");
show("Version","Server IP",2);

iambic 2008-02-27
  • 打赏
  • 举报
回复
重载解决不了?
taodm 2008-02-27
  • 打赏
  • 举报
回复
汗,对string类型使用不定参数宏,楼上的还真敢回。
jfsaka 2008-02-26
  • 打赏
  • 举报
回复
本来的函数是这样的read_xml(string server,string configuration,string ip,...),后面可能会有user_name,user_ID等项,如果用函数重载的话将无法适应函数的使用,所以只能使用可变参数,但是该怎么去控制可变参数的个数呢?
taodm 2008-02-25
  • 打赏
  • 举报
回复
绝对不可对class类型使用可变参数。
用vector<string>或者函数重载。
sheenl 2008-02-25
  • 打赏
  • 举报
回复
说句题外话, 可变参数的函数,本来就是严重不提倡的。
既然是c++了, 为什么不用函数重载?
hastings 2008-02-25
  • 打赏
  • 举报
回复
show函数中你有三个cout,当然无论如何都会输出三行的。。
sheenl 2008-02-25
  • 打赏
  • 举报
回复
没有办法。
C 的printf采用了在format字符串里的%来标志参数的方式。
wenjun1130 2008-02-25
  • 打赏
  • 举报
回复
你可以设置表示参数个数的变量参数啊
本课程采用了漫画+动手实操+练习讲授Python编程技能。课程简介:第6章 容器类型数据6.1 序列6.1.1 序列的索引操作6.1.2 加与乘操作6.1.3 切片操作6.1.4 成员测试6.2 列表6.2.1 创建列表6.2.2 追加元素6.2.3 插入元素6.2.4 替换元素6.2.5 删除元素6.3 元组6.3.1 创建元组6.3.2 元组拆包6.4 集合6.4.1 创建集合6.4.2 修改集合6.5 字典6.5.1 创建字典6.5.2 修改字典6.5.3 访问字典视图6.6 动动手 —— 遍历字典6.7 练一练第7章 字符串7.1 字符串的表示方式7.1.1 普通字符串7.1.2 原始字符串7.1.3 长字符串7.2 字符串与数字的相互转换7.2.1 将字符串转换为数字7.2.2 将数字转换为字符串7.3 格式化字符串7.3.1 使用占位符7.3.2 格式化控制符7.4 操作字符串7.4.1 字符串查找7.4.2 字符串替换7.4.3 字符串分割7.5 动动手 —— 统计英文文章中单词出现的频率7.6 练一练第8章 函数8.1 定义函数8.2 调用函数8.2.1 使用位置参数调用函数8.2.2 使用关键字参数调用函数8.3 参数的默认值8.4 可变参数8.4.1 基于元组的可变参数( *可变参数)8.4.2 基于字典的可变参数( **可变参数)8.5 函数中变量的作用域8.6 函数类型8.6.1 理解函数类型8.6.2 过滤函数filter()8.6.3 映射函数map()8.7 lambda()函数8.8 动动手 —— 使用更多的lambda()函数8.9 练一练第9章 类与对象9.1 面向对象9.2 定义类9.3 创建对象9.4 类的成员9.4.1 实例变量9.4.2 构造方法9.4.3 实例方法9.4.4 类变量19.5 封装9.5.1 私有变量9.5.2 私有方法9.5.3 使用属性9.6 继承性9.6.1 Python中的继承9.6.2 多继承9.6.3 重写方法9.7 多态性9.7.1 继承与多态9.7.2 鸭子类型测试与多态9.8 练一练第10章 异常处理9.8 练一练10.1 第一个异常 —— 除零异常10.2 捕获异常110.2.1 try-except语句10.2.2 多个except代码块10.2.3 多重异常捕获10.2.4 try-except语句嵌套10.3 使用finally代码块释放资源10.4 自定义异常类10.5 动动手 —— 手动引发异常10.6 练一练

64,385

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧