请教C可变参数的函数

软件和网站开发以及相关技术探讨
回复
头像
liujingjing5
帖子: 512
注册时间: 2006-10-12 1:21

请教C可变参数的函数

#1

帖子 liujingjing5 » 2011-06-17 9:36

我这样写错的,会打印出67894215696268679242157984215696213056716826868404198987185913448592384-12686832197742326441943048592384

6789到时对了,请问我怎么获得参数的个数啊? :em20

代码: 全选

void show(int,...);

int main(int argc,char ** argv){
	show(0,6,7,8,9);
}

void show(int m,...){
	va_list ap;
	va_start(ap,m);
	int x;
	while((x=va_arg(ap,int))!=0){
		cout << x;
	};

//	cout << va_arg(ap,int);
//	cout << va_arg(ap,int);
	va_end(ap);
}
头像
HelloAndroid
帖子: 156
注册时间: 2010-10-17 18:23

Re: 请教C可变参数的函数

#2

帖子 HelloAndroid » 2011-06-17 11:58

没用过,同样请教!
用起来还是蛮舒服的!
生命在于折腾!
为什么这个论坛复旦的人很少!!
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

Re: 请教C可变参数的函数

#3

帖子 tangboyun » 2011-06-18 22:38

你的问题应该先:
1、搞清楚可选参数的原理,这方面没有资料的话,可以先参考stdio.h中printf、scanf之类可变参函数的实现。
2、查阅中间几个宏的定义:va_start、va_arg、va_end的定义,这几个应该在stdarg中有。
可变参的原理其实也没什么,也就在函数调用时,找到入栈的第一个参数,然后慢慢往高地址一个个找(取决于函数调用约定),找啥?找结束标记,va list应该是个单向列表,所以没有办法直接读出参数个数的,只有找到结束标记为止。你程序里不是写了么?结束标记是0,可你输入的最后个参数是啥?是0么?嗯,然后就没找到,继续往后找。。。。就是这么回事。

没事不要用可变参,更不要去写可变参函数,容易溢出。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
头像
liujingjing5
帖子: 512
注册时间: 2006-10-12 1:21

Re: 请教C可变参数的函数

#4

帖子 liujingjing5 » 2011-06-19 0:28

tangboyun 写了:你的问题应该先:
1、搞清楚可选参数的原理,这方面没有资料的话,可以先参考stdio.h中printf、scanf之类可变参函数的实现。
2、查阅中间几个宏的定义:va_start、va_arg、va_end的定义,这几个应该在stdarg中有。
可变参的原理其实也没什么,也就在函数调用时,找到入栈的第一个参数,然后慢慢往高地址一个个找(取决于函数调用约定),找啥?找结束标记,va list应该是个单向列表,所以没有办法直接读出参数个数的,只有找到结束标记为止。你程序里不是写了么?结束标记是0,可你输入的最后个参数是啥?是0么?嗯,然后就没找到,继续往后找。。。。就是这么回事。

没事不要用可变参,更不要去写可变参函数,容易溢出。
谢谢你,研究了下,貌似是没法知道个数的,只有用一个参数告诉函数好了
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

Re: 请教C可变参数的函数

#5

帖子 tangboyun » 2011-06-19 12:01

printf、scanf这种因为可以从格式化字符串里预先知道参数个数的。
真要传很多参数的,可以考虑专门写个参数类。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
回复