首页 > 技术文章 > C基础知识(12):可变参数

storml 2017-11-13 15:02 原文

该功能需要使用<stdarg.h>函数的最后一个参数写成省略号,即三个点号(...)省略号之前的那个参数是int,代表了要传递的可变参数的总数。该文件提供了实现可变参数功能的函数和宏。

具体步骤如下:

(1) 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。

(2) 在函数定义中创建一个va_list类型变量。

(3) 使用int参数和va_start宏来初始化va_list变量为一个参数列表。

(4) 使用va_arg宏和va_list变量来访问参数列表中的每个项。

(5) 使用宏va_end来清理赋予va_list变量的内存。

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 
 4 double average(int num, ...);
 5 
 6 int main() {
 7     printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
 8 }
 9 
10 double average(int num, ...) {
11     va_list valist;
12     double sum = 0.0;
13     int i = 0;
14     // 为num个参数初始化valist
15     va_start(valist, num);
16     // 访问所有赋给valist的参数
17     for (i = 0; i < num; i++) {
18         sum += va_arg(valist, int);
19     }
20     // 清理为valist保留的内存
21     va_end(valist);
22     return sum / num;
23 }

 

另外一种格式:

 1 #include <stdarg.h>
 2 #include <stdio.h>
 3 
 4 void std_vararg_func(const char *pszFormat, ...) {
 5     va_list args;
 6     va_start(args, pszFormat);
 7 
 8     printf("%d\n", va_arg(args, int));
 9     printf("%f\n", va_arg(args, double));
10     printf("%s\n", va_arg(args, char*));
11 
12     va_end(args);
13 }
14 
15 int main() {
16     std_vararg_func("%d %f %s\n", 4, 5.4, "hello world");
17     return 0;
18 }

 

推荐阅读