我會通過自帶的MinGW的stdio.h頭文件,並注意到printf
函數聲明如下:c函數聲明中的「...」是什麼意思?
int printf (const char *__format, ...)
{
//body omitted
}
我從來沒有見過的省略號在函數參數列表前,所以我嘗試了一下。它編譯和運行沒有錯誤。那麼,「...」的目的是什麼?
我會通過自帶的MinGW的stdio.h頭文件,並注意到printf
函數聲明如下:c函數聲明中的「...」是什麼意思?
int printf (const char *__format, ...)
{
//body omitted
}
我從來沒有見過的省略號在函數參數列表前,所以我嘗試了一下。它編譯和運行沒有錯誤。那麼,「...」的目的是什麼?
這意味着,所述函數是可變參數函數採用可變數目的參數:
http://en.wikipedia.org/wiki/Variadic_function
printf()
本身可能是一個可變參數函數的最好的例子。
它通知編譯器該函數具有可變參數列表。這是一項只適用於__cdecl
調用約定的功能。它允許調用者在最後一個固定參數之後指定它想要的任何參數值,因爲當函數退出時,調用者將清除參數。可變參數通常用於printf樣式函數,其中可變參數值的解釋取決於固定參數值的值(例如,將參數__format
中的每個格式說明符的個別可變參數匹配)。
它用於允許可變數量的參數或未指定類型的參數,如printf()
所做的那樣。這使得可變數量argumnets的函數被調用Variadic Function
可變參數變量與va_start
,va_list
,va_end
和va_arg
Variable number of Arguments (...)
#include <stdarg.h>
double average(int count, ...)
{
va_list ap;
int j;
double tot = 0;
va_start(ap, count); //Requires the last fixed parameter (to get the address)
for(j=0; j<count; j++)
tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
va_end(ap);
return tot/count;
}
希望這有助於訪問。
哇。我不知道c有這些,現在就試試看。謝謝。 – Abbas
如果你想實現一個可變參數函數函數,你需要使用'stdarg.h'來訪問參數。所以它不如普通函數那麼簡單。 – Mysticial
你說得對,與其他語言相比,它不是直截了當的。我花了幾分鐘的時間即使使用維基百科樣本也可以寫出總和函數。無論如何,很高興知道它在那裏。更好的是沒有什麼:)。 – Abbas