const char* fmt

来源:互联网 发布:mac os x 10.12.6 iso 编辑:程序博客网 时间:2024/05/12 13:24
  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)

netjune 05-08-15 18:08
有些函数参数个数可变,例如printf,怎么实现?
 
如题

masterdemon 05-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_...的宏就是通过这种办法实现的。

lollipop 05-08-16 09:52
参数的个数怎么传递?

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

francxz 05-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”知道后面还有三个参数。

netjune 05-08-17 10:57
详细看了,,很巧妙阿


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

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

原创粉丝点击