天天看點

va_list va_start va_arg va_end

vsnprintf函數
 頭檔案:#include  <stdarg.h>
 函數原型:int vsnprintf(char *str, size_t size, const char *format, va_list ap);
 函數說明:将可變參數格式化輸出到一個字元數組
 參數:
 str輸出到的數組,size指定大小,防止越界,format格式化參數,ap可變參數清單函數用法
 #include <stdio.h>
 #include <stdarg.h>
  
 void SYSTEM(const char * format, ...)
 {
     char buff[4069];
     va_list list;
     va_start(list, format);
     vsnprintf(buff, 4069, format, list);
     va_end(list);
     printf("%s\n", buff);
 }
  
 void main()
 {
     SYSTEM("%d_%s", 6, "abc");
 }
 我們了解下可變參數,先看下面幾個定義
 typedef char *  va_list;
 #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )  
 #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )   //得到可變參數中第一個參數的首位址  
 #define va_arg(ap,type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )    //将參數轉換成需要的類型,并使ap指向下一個參數  
  #define va_end(ap)      ( ap = (va_list)0 )  
 函數參數儲存到棧中,根據va_start(ap,v)宏定義,可以看出此函數獲得可變參數受位址,接着通過va_arg取得各可變參數,最後調用va_end函數把ap指向空。寫面例子分别列印出指定數目的可變參數
  #include <stdio.h>
 #include <stdarg.h>
  
 void SYSTEM(int count, ...)
 {
     va_list ap;
     va_start(ap, count);
     int i = 0;
     for(i; i < count; i++)
     {
         printf("%d\n",va_arg(ap, int));
     }
     
     va_end(ap);
 }
  
 void main()
 {
     SYSTEM(3, 1, 2, 3);
 }
 結果列印出
 1
 2
 3