博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[zz]va_start() 和 va_end()函数应用
阅读量:7119 次
发布时间:2019-06-28

本文共 2297 字,大约阅读时间需要 7 分钟。

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,如下:

 

[c-sharp] 
  1. //vstart.c  
  2. #include <stdio.h>  
  3. #include <strings.h>  
  4. #include <stdarg.h>  
  5. int demo(char *fmt, ...);  
  6. int main()   
  7. {   
  8.    demo("DEMO""This""is""a""demo!""");   
  9.    return 0;  
  10. }   
  11. int demo( char *fmt, ... )   
  12. {   
  13.    va_list argp;   
  14.    int argno = 0;    
  15.    char *para;   
  16.    va_start(argp, fmt);   
  17.    while (1)   
  18.    {   
  19.       para = va_arg(argp, char *);   
  20.       if (strcmp( para, "") == 0)   
  21.       break;   
  22.       printf("Parameter #%d is: %s/n", argno, para);   
  23.       argno++;   
  24.    }   
  25.    va_end( argp );   
  26.    return 0;   
  27. }   

 

 

编译运行:

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

 

[c-sharp] 
  1. #include <stdio.h>  
  2. #include <stdarg.h>  
  3. #include <string.h>  
  4. int foo(char *fmt, ...);  
  5. int main()  
  6. {  
  7.   char *a = "ast";  
  8.   int b = 224;  
  9.   char c = 'x';  
  10.    
  11.   foo("%s,%d,%c/n",a,b,c);  
  12.   return 0;  
  13. }  
  14. int foo(char *fmt, ...)  
  15. {  
  16.   va_list ap;  
  17.   int d;  
  18.   char c, *s;  
  19.   va_start(ap, fmt);  
  20.   while (*fmt)  
  21.   switch(*fmt++)  
  22.   {  
  23.      case 's':           /* string */  
  24.         s = va_arg(ap, char *);  
  25.         printf("string %s/n", s);  
  26.         break;  
  27.      case 'd':           /* int */  
  28.         d = va_arg(ap, int);  
  29.         printf("int %d/n", d);  
  30.         break;  
  31.      case 'c':           /* char */  
  32.                              /* need a cast here since va_arg only 
  33.                                 takes fully promoted types */  
  34.         c = (char) va_arg(ap, int);  
  35.         printf("char %c/n", c);  
  36.         break;  
  37.   }  
  38.   va_end(ap);  
  39.   return 0;  
  40. }  
  41.                 

 

 

编译运行:

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

转载地址:http://dtiel.baihongyu.com/

你可能感兴趣的文章
The Five Best Linux BitTorrent Clients
查看>>
LeetCode: Path Sum 解题报告
查看>>
Struts2之文件上传(单文件/多文件)
查看>>
【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
查看>>
基于HT for Web的Web SCADA工控移动应用
查看>>
JavaScript-常用正则函数(适合忘记时看)
查看>>
Sphinx-实战
查看>>
窗体之间传递值的几种方法
查看>>
onSingleTapUp()和onSingleTapConfirmed()的区别
查看>>
Android app应用多语言切换功能实现
查看>>
严重: Catalina.stop: java.net.ConnectException: Connection refused: connect
查看>>
几个常用的ps命令
查看>>
java如何获取本机IP
查看>>
gradle入门(1-7)eclipse和gradle集成插件的安装和使用
查看>>
uva 1378 - A Funny Stone Game sg博弈
查看>>
F#试用感受
查看>>
JavaScript继承详解(三)
查看>>
Java/JSP中使用JDBC连接SQL Server 2000/2005
查看>>
SSH框架+mysql+tomcat 服务器 中文乱码解决方案
查看>>
C++ 沉思录——Chap4:设计类的核查表
查看>>