2010年8月20日 星期五

不定參數的 function 宣告方法

有時我們要做一些動作,參數是不固定的,例如取一堆整數的最大值


int Max(int a, int b, int c, int d, int e);


這時可以改成


int Max(int a, ...)
{
  int count = 0, sum = 0, i = a;
  va_list maker; // 宣告一個 list
  va_start(maker, a); // 設初始指標為 a 的位址
  while(i != (-1))
  {
    sum += i;
    ++count;
    i = va_arg(maker, int); // 將 list 現在所指指標往後移一個 int
  }
  va_end(maker); // 將list設回0
  return sum;
}


這些 va_ 什麼鬼的其實很有趣,他們並不是 function,而是巨集 Marco


#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,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )


大概看一下原型就可以知道運作的原理了,在建置專案時,前置處理器就會幫你置換這些符號的內容,蠻有趣的。

1 則留言:

  1. Hi, 謝謝你的文章幫我寫出不定參數的函式,
    不過容我抓一個小瑕疵:

    int Max(int a ...)

    變數 a 後面應該有一個 , 才能成立。
    Thanks for your guide, again.

    回覆刪除