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 )
大概看一下原型就可以知道運作的原理了,在建置專案時,前置處理器就會幫你置換這些符號的內容,蠻有趣的。
Hi, 謝謝你的文章幫我寫出不定參數的函式,
回覆刪除不過容我抓一個小瑕疵:
int Max(int a ...)
變數 a 後面應該有一個 , 才能成立。
Thanks for your guide, again.