1. 程式人生 > >可變參數函數

可變參數函數

this 指針 定義 字符指針 http 我們 通過 下一個 獲取參數

https://blog.csdn.net/zhangxiangdavaid/article/details/38278249

https://www.cnblogs.com/engraver-lxw/p/7225232.html

int demo(char* msg,...)
{
if (!msg)
{
return 0;
}

int count = 0;

va_list p;
va_start(p, msg);

while (true)
{
count++;
char* s = va_arg(p, char*);

if (strcmp(s, "") == 0)
{
printf("\n");

break;
}

printf("%s", s);
}

va_end(p);

return count;
}

//測試
int count = demo("demo", "This", "is", "a", "demo!", "");

可變參數函數的一般形式如下:
返回值類型 函數名(類型1 參數1,類型2 參數2,...類型n 參數n,...);

如上所示,這是一個典型的可變參數樣式,它共有n個確定的參數,最後的...表示可變參數的含義。必須指出...必須位於最後,並且它至少要有一個確定的參數。

為了開發可變參數的函數,需用到頭文件stdarg.h。
下面是 <stdarg.h> 裏面重要的幾個宏定義如下:

typedef char* va_list;
void va_start ( va_list ap, prev_param ); /* ANSI version */
type va_arg ( va_list ap, type );
void va_end ( va_list ap );


  va_list 是一個字符指針,可以理解為指向當前參數的一個指針,取參必須通過這個指針進行。
  <Step 1> 在調用參數表之前,定義一個 va_list 類型的變量,(假設va_list 類型變量被定義為ap);
  <Step 2> 然後應該對ap 進行初始化,讓它指向可變參數表裏面的第一個參數,這是通過 va_start 來實現的,第一個參數是 ap 本身,第二個參數是在變參表前面緊挨著的一個變量,即“...”之前的那個參數;

  <Step 3> 然後是獲取參數,調用va_arg,它的第一個參數是ap,第二個參數是要獲取的參數的指定類型,然後返回這個指定類型的值,並且把 ap 的位置指向變參表的下一個變量位置;
  <Step 4> 獲取所有的參數之後,我們有必要將這個 ap 指針關掉,以免發生危險,方法是調用 va_end,他是輸入的參數 ap 置為 NULL,應該養成獲取完參數表之後關閉指針的習慣。說白了,就是讓我們的程序具有健壯性。通常va_start和va_end是成對出現

va_start()的作用是使va_list型的變量指向第一個可變參數,故需要使用到離...最近的一個固定的確定的參數,
這就是在設計可變參數函數時至少需要一個確定參數的原因。

接著使用va_arg(p, char*),不斷解析pData指向內存區域,且要指明用何種方式解析,這是va_arg()第二個參數的作用,
解析完後,pData指向下一個可變參數的地址。由此即可得到所有的可變參數的值。

可變參數函數