C語言允許創建一個接收實參個數不確定的函數。例如PRintf就可以接收任意數目的實參。若要聲明一個參數個數不確定的函數,可將省略號(…)放在函數原型的形參列表末尾,用于表示這個函數可以接收可變數目的各種類型的實參。如下:
int printf(const char *format, ...);可變實參頭文件stdarg.h中的宏和定義,為創建一個可變長實參列表的函數提供了必需的功能。如下:
va_list 適用于保存va_start、va_arg和va_end所需的信息。為了訪問到一個可變長實參列表中的實參,必須定義一個類型為va_list的變量va_start 在一個可變長實參列表中的實參被訪問之前,先調用這個宏,初始化用va_list聲明的對象以便讓va_arg和va_end來使用va_arg 這個宏展開成一個表示可變長實參列表中下一個實參的值和類型的表達式。每次對va_arg的調用都要修改用va_list聲明的對象,以使這個對象指向列表中的下一個實參va_end 當一個函數的可變長實參列表是由va_start來引用時,宏va_end可用于從這樣的函數中正常返回宏va_start接受兩個實參,一個是va_list聲明的對象,另一個是實參列表中在省略號前的最右邊的標識符。 宏va_arg接受兩個實參,一個是va_list聲明的對象,另一個是期望在實參列表中出現的數據的類型,宏va_arg返回的是實參的值。 宏va_end接受一個實參,即va_list聲明的對象,以便調用的函數正常返回。 例如下:
#include <stdio.h>#include <stdarg.h>double average(int i, ...);int main(int argc, char const *argv[]){ //average(4, 3, 1, 2, 2); printf("%f/n", average(4, 3.0, 1.0, 2.0, 2.0)); return 0;}double average(int i, ...) { va_list args; va_start(args, i); int counter = 0; double sum = 0; for (; counter < i; counter++) { sum += va_arg(args, double); //printf("%d/n", va_arg(args, int)); } va_end(args); return sum / i;}新聞熱點
疑難解答