可變參數函數

维基百科,自由的百科全书
跳转至: 导航搜索

計算機程序設計,一個可變參數函數是指一個函數擁有不定引數,即是它接受一個可變數目的參數。不同的程式語言對可變參數函數的支持有很大差異。

一般而言,在設計函數時會遇到許多數學邏輯操作,是需要一些可變功能。例如,計算數字串的總和、字符串的聯接或其他操作過程,都可以存在任意數量的引數。

另一種許多語言都實現為可變參數函數的是格式輸出函數,在C語言printf函數和Common Lispformat函數就是例子。這些函數都需要一個參數,指定格式的輸出,再讀取可變參數的值進行格式化。

另外,可變參數函數在某些語言存在安全問題。例如C語言在沒有長度檢查和類型檢查,在傳入過少的參數或不符的類型時可能會出現溢位的情況,更可能會被利用為攻擊目標。所以,在設計函數時可以先考慮其他替補方案,例如以類型安全的方式——重載

例子[编辑]

C/C++[编辑]

C語言中,C標準函式庫stdarg.h標頭檔定義了提供可變參數函數使用的巨集。在C++,應該使用標頭檔cstdarg

要創建一個可變參數函數,必須把省略號(...)放到參數列表後面。函數內部必須定義一個va_list變數。然後使用巨集va_startva_argva_end來讀取。例如:

#include <stdarg.h>
 
double average(int count, ...)
{
    va_list ap;
    int j;
    double tot = 0;
    va_start(ap, count); //使va_list指向起始的參數
    for(j=0; j<count; j++)
        tot+=va_arg(ap, double); //檢索參數,必須按需要指定類型
    va_end(ap); //釋放va_list
    return tot/count;
}

這個是一段計算平均數的程式碼,可以輸入任意數量的小數並計算平均數。請注意,函數不知道參數的數量或它們的類型,這裡要求的類型是double,而且第一個參數傳遞可變參數的數量。在另外的情況​​下,例如printf,參數的數量和類型都設定在格式字符串中。在這兩種情況下,程序員實際上需要提供正確的參數,如果參數傳遞少了或參數的類型不正確,導致讀入內存的無效區(溢位),這樣會有安全漏洞如格式字符串攻擊。

參見[编辑]

外部連結[编辑]