经常在阅读大神的代码或者很多内核代码时会见到类似这样格式的代码:
void function(const char *, ...) // 哪儿来的省略号??我记得这文件不是伪代码啊
{
/* 以下是代码部分 */
}
我也曾一度怀疑我是不是查到了伪代码,或者是书籍本身的省略
后来我又一次成功演绎了真香定律
原来这是C语言里面可变参数列表的一种语法,而且其实是挺常见的一个东西,比如printf()和scanf()函数就用到了这个
(但凡有注意到过printf()函数可以输入不同数量的参数的时候就可以想到一定有这么一个东西支持多参数)
可变参数函数:
其实我们自己也能定义这样的函数,而且使用上也并不难,比如下面的示例代码:
#include <stdio.h>
#include <stdarg.h> // 需要加入这个头文件
int function(int n, ...);
int main()
{
// 调用两次函数试试,让参数数量不同
int s1, s2;
s1 = function(4, 1, 2, 3 ,4); // 四个参数
s2 = function(3, 5, 5, 5); // 三个参数
printf("\n\ns%d=%d\n", 1, s1); // printf()函数其实也是这种可变参数函数
printf("s2=%d\n", s2);
return 0;
}
int function(int n, ...) // 三个点是由三个连续的小数点字符组成
{
int sum = 0;
int i = 0;
va_list vp; // 用于表示参数列表 ,vp是个指针
va_start(vp, n); // vp指向第一个参数
int a[30];
for (i = 0;i < n;i++)
{
a[i] = va_arg(vp, int); // 获取到参数值
printf("var[%d]=%d\n", i, a[i]);
sum += a[i];
}
va_end(vp); // 清空vp指针
return sum;
}
运行一下看看:
主要用到的东西就是:
#include <stdarg.h> // 要加这个头文件
va_list vp; // 一个类型
va_start(vp, n); // 三个宏
va_arg(vp, int);
va_end(vp);
type function(...){} // 当然还有最关键的,三个点