|
va_start()va_end()函数应用: man: #include <stdarg.h>
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); 1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表 void foo(...); void foo(parm_list,...);
2:函数参数的传递原理 函数参数是以数据结构:栈的形式存取,从右至左入栈. eg: #include void fun(int a, ...) { int *temp = &a; temp++; for (int i = 0; i < a; ++i) { cout << *temp << endl; temp++; } } int main() { int a = 1; int b = 2; int c = 3; int d = 4; fun(4, a, b, c, d); system("pause"); return 0; } Output:: 1 2 3 4
3:获取省略号指定的参数 在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。
4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。
实例: 编写vstart.c,如下:
view plaincopy to clipboardprint? //vstart.c #include <stdio.h> #include <strings.h> #include <stdarg.h> int demo(char *fmt, ...); int main() { demo("DEMO", "This", "is", "a", "demo!", ""); return 0; } int demo( char *fmt, ... ) { va_list argp; int argno = 0; char *para; va_start(argp, fmt); while (1) { para = va_arg(argp, char *); if (strcmp( para, "") == 0) break; printf("Parameter #%d is: %s/n", argno, para); argno++; } va_end( argp ); return 0; } //vstart.c #include <stdio.h> #include <strings.h> #include <stdarg.h> int demo(char *fmt, ...); int main() { demo("DEMO", "This", "is", "a", "demo!", ""); return 0; } int demo( char *fmt, ... ) { va_list argp; int argno = 0; char *para; va_start(argp, fmt); while (1) { para = va_arg(argp, char *); if (strcmp( para, "") == 0) break; printf("Parameter #%d is: %s/n", argno, para); argno++; } va_end( argp ); return 0; }
编译运行:
[root@fly test]# gcc -o vstart vstart.c [root@fly test]# ./vstart Parameter #0 is: This Parameter #1 is: is Parameter #2 is: a Parameter #3 is: demo! [root@fly test]#
注意:va_arg()的格式:
type va_arg(va_list ap, type);
因此:
int d; char c, *s;
d = va_arg(ap, int); /* int */
c = (char) va_arg(ap, int); /* char */
s = va_arg(ap, char *); /* string */
实例2:(start.c)
view plaincopy to clipboardprint? #include <stdio.h> #include <stdarg.h> #include <string.h> int foo(char *fmt, ...); int main() { char *a = "ast"; int b = 224; char c = 'x'; foo("%s,%d,%c/n",a,b,c); return 0; } int foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch(*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s/n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d/n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c/n", c); break; } va_end(ap); return 0; } #include <stdio.h> #include <stdarg.h> #include <string.h> int foo(char *fmt, ...); int main() { char *a = "ast"; int b = 224; char c = 'x'; foo("%s,%d,%c/n",a,b,c); return 0; } int foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch(*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s/n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d/n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c/n", c); break; } va_end(ap); return 0; }
编译运行:
[root@fly test]# gcc -o start start.c [root@fly test]# ./start string ast int 224 char x [root@fly test]#
注意foo()格式:
foo("%s,%d,%c/n",a,b,c);
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ast_224/archive/2009/02/18/3906167.aspx
|