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,如下:
//vstart.c<br />#include <stdio.h><br />#include <strings.h><br />#include <stdarg.h><br />int demo(char *fmt, ...);<br />int main()<br />{<br /> demo("DEMO", "This", "is", "a", "demo!", "");<br /> return 0;<br />}<br />int demo( char *fmt, ... )<br />{<br /> va_list argp;<br /> int argno = 0;<br /> char *para;<br /> va_start(argp, fmt);<br /> while (1)<br /> {<br /> para = va_arg(argp, char *);<br /> if (strcmp( para, "") == 0)<br /> break;<br /> printf("Parameter #%d is: %s/n", argno, para);<br /> argno++;<br /> }<br /> va_end( argp );<br /> return 0;<br />}<br />
編譯運行:
[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)
#include <stdio.h><br />#include <stdarg.h><br />#include <string.h><br />int foo(char *fmt, ...);<br />int main()<br />{<br /> char *a = "ast";<br /> int b = 224;<br /> char c = 'x';</p><p> foo("%s,%d,%c/n",a,b,c);<br /> return 0;<br />}<br />int foo(char *fmt, ...)<br />{<br /> va_list ap;<br /> int d;<br /> char c, *s;<br /> va_start(ap, fmt);<br /> while (*fmt)<br /> switch(*fmt++)<br /> {<br /> case 's': /* string */<br />s = va_arg(ap, char *);<br /> printf("string %s/n", s);<br /> break;<br /> case 'd': /* int */<br /> d = va_arg(ap, int);<br /> printf("int %d/n", d);<br /> break;<br /> case 'c': /* char */<br /> /* need a cast here since va_arg only<br /> takes fully promoted types */<br /> c = (char) va_arg(ap, int);<br /> printf("char %c/n", c);<br /> break;<br /> }<br /> va_end(ap);<br /> return 0;<br />}</p><p>
編譯運行:
[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);