C語言可變參數(shù)函數(shù)詳解
C語言可變參數(shù)函數(shù)
C 語言允許定義參數(shù)數(shù)量可變的函數(shù),這稱為可變參數(shù)函數(shù)(variadic function)。這種函數(shù)需要固定數(shù)量的強制參數(shù)(mandatory argument),后面是數(shù)量可變的可選參數(shù)(optional argument)。
這種函數(shù)必須至少有一個強制參數(shù)??蛇x參數(shù)的類型可以變化??蛇x參數(shù)的數(shù)量由強制參數(shù)的值決定,或由用來定義可選參數(shù)列表的特殊值決定。
C 語言中最常用的可變參數(shù)函數(shù)例子是 printf()和 scanf()。這兩個函數(shù)都有一個強制參數(shù),即格式化字符串。格式化字符串中的轉(zhuǎn)換修飾符決定了可選參數(shù)的數(shù)量和類型。
對于每一個強制參數(shù)來說,函數(shù)頭部都會顯示一個適當?shù)膮?shù),像普通函數(shù)聲明一樣。參數(shù)列表的格式是強制性參數(shù)在前,后面跟著一個逗號和省略號(...),這個省略號代表可選參數(shù)。
可變參數(shù)函數(shù)要獲取可選參數(shù)時,必須通過一個類型為 va_list 的對象,它包含了參數(shù)信息。這種類型的對象也稱為參數(shù)指針(argument pointer),它包含了棧中至少一個參數(shù)的位置??梢允褂眠@個參數(shù)指針從一個可選參數(shù)移動到下一個可選參數(shù),由此,函數(shù)就可以獲取所有的可選參數(shù)。va_list 類型被定義在頭文件 stdarg.h 中。
當編寫支持參數(shù)數(shù)量可變的函數(shù)時,必須用 va_list 類型定義參數(shù)指針,以獲取可選參數(shù)。在下面的討論中,va_list 對象被命名為 argptr??梢杂?4 個宏來處理該參數(shù)指針,這些宏都定義在頭文件 stdarg.h 中:
void va_start(va_list argptr, lastparam);
宏 va_start 使用第一個可選參數(shù)的位置來初始化 argptr 參數(shù)指針。該宏的第二個參數(shù)必須是該函數(shù)最后一個有名稱參數(shù)的名稱。必須先調(diào)用該宏,才可以開始使用可選參數(shù)。
type va_arg(va_list argptr, type);
展開宏 va_arg 會得到當前 argptr 所引用的可選參數(shù),也會將 argptr 移動到列表中的下一個參數(shù)。宏 va_arg 的第二個參數(shù)是剛剛被讀入的參數(shù)的類型。
void va_end(va_list argptr);
當不再需要使用參數(shù)指針時,必須調(diào)用宏 va_end。如果想使用宏 va_start 或者宏 va_copy 來重新初始化一個之前用過的參數(shù)指針,也必須先調(diào)用宏 va_end。
void va_copy(va_list dest, va_list src);
宏 va_copy 使用當前的 src 值來初始化參數(shù)指針 dest。然后就可以使用 dest 中的備份獲取可選參數(shù)列表,從 src 所引用的位置開始。
例 1 中的函數(shù)展示了這些宏的使用方法。
【例1】函數(shù) add()
// 函數(shù)add() 計算可選參數(shù)之和 // 參數(shù):第一個強制參數(shù)指定了可選參數(shù)的數(shù)量,可選參數(shù)為double類型 // 返回值:和值,double類型 double add( int n, ... ) { int i = 0; double sum = 0.0; va_list argptr; va_start( argptr, n ); // 初始化argptr for ( i = 0; i < n; ++i ) // 對每個可選參數(shù),讀取類型為double的參數(shù), sum += va_arg( argptr, double ); // 然后累加到sum中 va_end( argptr ); return sum; }
總結
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
C/C++實現(xiàn)動態(tài)數(shù)組的示例詳解
動態(tài)數(shù)組相比于靜態(tài)數(shù)組具有更大的靈活性,因為其大小可以在運行時根據(jù)程序的需要動態(tài)地進行分配和調(diào)整,本文為大家介紹了C++實現(xiàn)動態(tài)數(shù)組的方法,需要的可以參考下2023-08-08詳解state狀態(tài)模式及在C++設計模式編程中的使用實例
這篇文章主要介紹了state狀態(tài)模式及在C++設計模式編程中的使用實例,在設計模式中策略用來處理算法變化,而狀態(tài)則是透明地處理狀態(tài)變化,需要的朋友可以參考下2016-03-03