<cstdarg>

va_arg

type va_arg (va_list ap, type)
檢索下一個引數
此宏展開為一個型別為 type 的表示式,其值為由 ap 標識的可變引數列表中的當前引數

每次呼叫此宏都會修改 ap 的狀態,以便下一次呼叫此宏時會展開為它所求值的引數之後的那個引數。

請注意,va_arg 無法確定傳遞給函式的引數的實際型別,而是使用作為 type 宏引數傳遞的任何型別作為其型別。

另請注意,va_arg 既不確定檢索到的引數是否是傳遞給函式的最後一個引數(甚至不確定它是否是該列表末尾之外的元素)。函式的設計方式應該能夠透過命名引數的值或已經讀取的附加引數的值以某種方式推斷出引數的數量。

引數

ap
型別為 va_list 的物件,攜帶有關可變引數列表當前檢索狀態的資訊。此物件應已透過對 va_startva_copy 的初始呼叫進行初始化,並且尚未用 va_end 釋放。
型別
一個型別名稱。此型別名稱用作該宏展開的表示式的型別(即其返回型別)。
要使一個型別表示式適合與 va_arg 一起使用,它必須是這樣的型別,即 type* 會產生一個指向 type 的指標。
type 應與提取的引數的型別(根據預設引數提升規則提升後的型別)相容,或者一個是另一個的無符號版本,或者一個是空指標而另一個是某種其他指標型別。

返回值

返回當前的附加引數,作為 type 型別的表示式。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* va_arg example */
#include <stdio.h>      /* printf */
#include <stdarg.h>     /* va_list, va_start, va_arg, va_end */

int FindMax (int n, ...)
{
  int i,val,largest;
  va_list vl;
  va_start(vl,n);
  largest=va_arg(vl,int);
  for (i=1;i<n;i++)
  {
    val=va_arg(vl,int);
    largest=(largest>val)?largest:val;
  }
  va_end(vl);
  return largest;
}

int main ()
{
  int m;
  m= FindMax (7,702,422,631,834,892,104,772);
  printf ("The largest value is: %d\n",m);
  return 0;
}

這個 FindMax 函式將其要接收的附加引數的數量作為第一個引數。它會檢索第一個附加引數並將其用作比較的初始參考值,然後在迴圈中檢索剩餘的附加引數並進行比較,以返回最大的一個(在本例中為 892)。

輸出
The largest value is: 892


另見