2011-11-14 69 views
2

我會通過自帶的MinGW的stdio.h頭文件,並注意到printf函數聲明如下:c函數聲明中的「...」是什麼意思?

int printf (const char *__format, ...) 
{ 
    //body omitted 
} 

我從來沒有見過的省略號在函數參數列表前,所以我嘗試了一下。它編譯和運行沒有錯誤。那麼,「...」的目的是什麼?

回答

5

這意味着,所述函數是可變參數函數採用可變數目的參數:

http://en.wikipedia.org/wiki/Variadic_function

printf()本身可能是一個可變參數函數的最好的例子。

+0

哇。我不知道c有這些,現在就試試看。謝謝。 – Abbas

+1

如果你想實現一個可變參數函數函數,你需要使用'stdarg.h'來訪問參數。所以它不如普通函數那麼簡單。 – Mysticial

+0

你說得對,與其他語言相比,它不是直截了當的。我花了幾分鐘的時間即使使用維基百科樣本也可以寫出總和函數。無論如何,很高興知道它在那裏。更好的是沒有什麼:)。 – Abbas

2

它通知編譯器該函數具有可變參數列表。這是一項只適用於__cdecl調用約定的功能。它允許調用者在最後一個固定參數之後指定它想要的任何參數值,因爲當函數退出時,調用者將清除參數。可變參數通常用於printf樣式函數,其中可變參數值的解釋取決於固定參數值的值(例如,將參數__format中的每個格式說明符的個別可變參數匹配)。

1

它用於允許可變數量的參數或未指定類型的參數,如printf()所做的那樣。這使得可變數量argumnets的函數被調用Variadic Function

可變參數變量與va_startva_listva_endva_arg

Variable number of Arguments (...)

Sample Implementation:

#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; 
} 

希望這有助於訪問。

+0

請解釋'va_list ap;'和'va_end(ap)''行。先謝謝你。 – wannik

+1

va_list和va_end是在stdarg.h庫中定義的宏,va_list用於參數指針(ap)變量。而va_end(ap)結束使用參數指針。在va_end調用之後,使用相同ap進一步調用va_arg可能不起作用。 – AlphaMale

相關問題