1. 程式人生 > >va_start,va_arg,va_end的用法

va_start,va_arg,va_end的用法

來源:http://topic.csdn.net/t/20030418/20/1680144.html

標頭檔案<stdarg.h> 按照   ANSI    C   標準中的規範說明,   以   <stdarg.h>   為介面的庫包含著幾個函式的巨集,   它們提供了一種可移植的方法來控制可變引數表。注意:   不是任何   C   編譯器都支援標頭檔案   <stdarg.h>,   僅僅那些遵照   ANSI    C   標準的才支援這個檔案。標頭檔案   <stdarg.h>   說明了一個型別並定義了三個巨集,   用來處理被調函式引數個數和型別未知的引數表。

例子:  
  #include<stdarg.h>  
  #include<stdio.h>  
   
  void   errmsg(int   code,...)  
  {  
  va_list   argptr;  
  char   *fmt;  
  va_start(argptr,code);//在訪問任何未知引數之前argptr必須用巨集va_start來初始化一次  
  if(code   &FILENAME)  
  fprintf(stderr,"%s:",argptr,char   *));  
  if(code   &LINENUMBER)  
  fprintf(stderr,"%s:",argptr,int));  
  if(code&WARNING)  
  fputs("warning:",stderr);  
  fmt=va_arg(argptr,char*);  
  fprintf(stderr,fmt,va_arg(argptr,char   *));  
  va_end(argptr);//引數處理完畢後,並且在退出errmsg()之前,   個巨集被呼叫一次  
  }

stdarg.h   -   handle   variable   argument   list    
  #include   <stdarg.h>  
   
  #define     MAXARGS           31  
   
  int   execl   (const   char   *file,   const   char   *args,   ...)  
  {  
          va_list   ap;  
          char   *array[MAXARGS];  
          int   argno   =   0;  
                  va_start(ap,   args);  
          while   (args   !=   0)   {  
                  array[argno++]   =   args;  
                  args   =   va_arg(ap,   const   char   *);  
  }  
  va_end(ap);  
  return   execv(file,   array);  
  }  

來源:http://msdn.microsoft.com/zh-cn/library/kb57fad8.aspx