C語言的可變參數函數實現詳解
1、簡介
今天看到一個有趣的東西C語言的可變參數函數
眾所周知,C語言的函數不能重載,那麼你printf和scanf是怎麼可以輸入多個參數的
例如查看到的printf的定義為
printf(const char *_Restrict, …);
這稱為可變參數函數。這種函數需要固定數量的強制參數,後面是數量可變的可選參數
這種函數必須至少有一個強制參數。可選參數的類型可以變化。可選參數的數量由強制參數的值決定,或由用來定義可選參數列表的特殊值決定。
C 語言中最常用的可變參數函數例子是 printf()和 scanf()。這兩個函數都有一個強制參數,即格式化字符串。格式化字符串中的轉換修飾符決定瞭可選參數的數量和類型。
對於每一個強制參數來說,函數頭部都會顯示一個適當的參數,像普通函數聲明一樣。參數列表的格式是強制性參數在前,後面跟著一個逗號和省略號(…),這個省略號代表可選參數。
可變參數函數要獲取可選參數時,必須通過一個類型為 va_list 的對象,它包含瞭參數信息。這種類型的對象也稱為參數指針(argument pointer),它包含瞭棧中至少一個參數的位置。可以使用這個參數指針從一個可選參數移動到下一個可選參數,由此,函數就可以獲取所有的可選參數。va_list 類型被定義在頭文件 stdarg.h 中。
void va_start(va_list argptr, lastparam);
宏 va_start 使用第一個可選參數的位置來初始化 argptr 參數指針。該宏的第二個參數必須是該函數最後一個有名稱參數的名稱。必須先調用該宏,才可以開始使用可選參數。
type va_arg(va_list argptr, type);
展開宏 va_arg 會得到當前 argptr 所引用的可選參數,也會將 argptr 移動到列表中的下一個參數。宏 va_arg 的第二個參數是剛剛被讀入的參數的類型。
void va_end(va_list argptr);
當不再需要使用參數指針時,必須調用宏 va_end。如果想使用宏 va_start 或者宏 va_copy 來重新初始化一個之前用過的參數指針,也必須先調用宏 va_end。
void va_copy(va_list dest, va_list src);
宏 va_copy 使用當前的 src 值來初始化參數指針 dest。然後就可以使用 dest 中的備份獲取可選參數列表,從 src 所引用的位置開始。
2、簡單的使用方式
// 函數add() 計算可選參數之和 // 參數:第一個強制參數指定瞭可選參數的數量,可選參數為double類型 // 返回值:和值,double類型 int add( int n, ... ) { int i = 0; int sum = 0.0; va_list argptr; va_start( argptr, n ); // 初始化argptr for ( i = 0; i < n; ++i ) // 對每個可選參數,讀取類型為int的參數, sum += va_arg( argptr, int ); // 然後累加到sum中 va_end( argptr ); return sum; } int main(int argc, char *argv[]) { int sum = add(5,1,2,3,4,5); printf("%d\n",sum); }
以上內容均來自-
http://c.biancheng.net/view/344.html
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!