va_start、va_arg、va_end分析

来源:互联网 发布:淘宝 大类目小类目 编辑:程序博客网 时间:2024/05/01 00:25

acenv.h中有:

#ifndef va_arg#ifndef _VALIST#define _VALISTtypedef char *va_list;#endif/* _VALIST *//* * Storage alignment properties */#define  _AUPBND                (sizeof (acpi_native_int) - 1)#define  _ADNBND                (sizeof (acpi_native_int) - 1)/* * Variable argument list macro definitions */#define _bnd(X, bnd)            (((sizeof (X)) + (bnd)) & (~(bnd)))#define va_arg(ap, T)           (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))#define va_end(ap)              (void) 0#define va_start(ap, A)         (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))#endif/* va_arg */


参数是存放在栈里面的,所以得到的第一个参数,可以通过偏移等相关操作来得到第2个3个,直到NULL
网上找到的2个例子:

//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;   }   

#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;  }  

跑一下试试吧!








原创粉丝点击