va_start()va_end()函數應用

來源:互聯網
上載者:User

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);

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.