LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1154|回复: 6

有些函数参数个数可变,例如printf,怎么实现?

[复制链接]
发表于 2005-8-15 18:08:59 | 显示全部楼层 |阅读模式
如题
发表于 2005-8-15 18:27:15 | 显示全部楼层
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

具体说明请看man va_start。
回复 支持 反对

使用道具 举报

发表于 2005-8-16 09:42:51 | 显示全部楼层
va_xxx 在VC中表现为宏。
实际上它主要是利用函数参数的内存空间连续性实现的。
比如int foo(int x,...)
如果调用时foo(1,2,3,4,5,6)
则在foo内部通过&x取得第一个参数的地址后,+4就是第二个参数的地址,这样就可以得到2,依此类推,所有参数就拿到了。
那么那些va_...的宏就是通过这种办法实现的。
回复 支持 反对

使用道具 举报

发表于 2005-8-16 09:52:40 | 显示全部楼层
参数的个数怎么传递?
回复 支持 反对

使用道具 举报

发表于 2005-8-16 10:11:34 | 显示全部楼层
如果是printf这样的,是不需要传递参数个数的,她是根据第一个参数(即那个format字符串)决定从栈里拿多少参数(正因为这样,所以才会有printf溢出问题的存在)
回复 支持 反对

使用道具 举报

发表于 2005-8-17 05:13:08 | 显示全部楼层
Post by lollipop
参数的个数怎么传递?

  1. void easy_printf(char* arg_types, ...){
  2.         va_list        arg_list;
  3.         int        arg_int;
  4.         char *        arg_str;
  5.         double        arg_float;
  6.         char *        cur_type;

  7.         cur_type = arg_types;
  8.         va_start(arg_list,arg_types);
  9.         while('\0' != *cur_type){
  10.                 switch(*cur_type){
  11.                 case 'i':
  12.                         arg_int = va_arg(arg_list,int);
  13.                         cerr << arg_int;
  14.                         break;
  15.                 case 'f':
  16.                         arg_float = va_arg(arg_list,double);
  17.                         cerr << arg_float;
  18.                         break;
  19.                 case 's':
  20.                         arg_str = va_arg(arg_list,char*);
  21.                         cerr << arg_str;
  22.                         break;
  23.                 default:
  24.                         break;
  25.                 }
  26.                 cur_type++;
  27.         }
  28.         va_end(arg_list);
  29.         cerr << endl;
  30. }
复制代码

一个小例子。使用的时候,easy_printf("sss", "ok", "u", "right"); 通过第一个参数“sss”知道后面还有三个参数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-17 10:57:25 | 显示全部楼层
详细看了,,很巧妙阿
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表