const char* fmt

 
LinuxSir.Org

LinuxSir.Org ( http://www.linuxsir.org/bbs/index.php)
-   Linux 程序设计专题讨论 ( http://www.linuxsir.org/bbs/forumdisplay.php?f=76)
-   -   有些函数参数个数可变,例如printf,怎么实现? ( http://www.linuxsir.org/bbs/showthread.php?t=214084)

netjune05-08-15 18:08

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

masterdemon05-08-15 18:27

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。

弥敦路九号05-08-16 09:42

va_xxx 在VC中表现为宏。
实际上它主要是利用函数参数的内存空间连续性实现的。
比如int foo(int x,...)
如果调用时foo(1,2,3,4,5,6)
则在foo内部通过&x取得第一个参数的地址后,+4就是第二个参数的地址,这样就可以得到2,依此类推,所有参数就拿到了。
那么那些va_...的宏就是通过这种办法实现的。

lollipop05-08-16 09:52

参数的个数怎么传递?

rickxbx05-08-16 10:11

如果是printf这样的,是不需要传递参数个数的,她是根据第一个参数(即那个format字符串)决定从栈里拿多少参数(正因为这样,所以才会有printf溢出问题的存在)

francxz05-08-17 05:13

引用:

作者: lollipop

参数的个数怎么传递?

代码:

void easy_printf(char* arg_types, ...){
        va_list        arg_list;
        int        arg_int;
        char *        arg_str;
        double        arg_float;
        char *        cur_type;

        cur_type = arg_types;
        va_start(arg_list,arg_types);
        while('/0' != *cur_type){
                switch(*cur_type){
                case 'i':
                        arg_int = va_arg(arg_list,int);
                        cerr << arg_int;
                        break;
                case 'f':
                        arg_float = va_arg(arg_list,double);
                        cerr << arg_float;
                        break;
                case 's':
                        arg_str = va_arg(arg_list,char*);
                        cerr << arg_str;
                        break;
                default:
                        break;
                }
                cur_type++;
        }
        va_end(arg_list);
        cerr << endl;
}


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

netjune05-08-17 10:57

详细看了,,很巧妙阿


所有时间均为[北京时间]。现在的时间是 14:28

Powered by vBulletin 版本 3.5.4
版权所有 ©2000 - 2007, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2000 - 2005, Jelsoft Enterprises Ltd.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值