如何写一个简单的可变参数的C函数
写可变参数的C函数要在程序中用到以下这些宏:
void va_start(va_list arg_ptr,prev_param);
type va_arg(va_list arg_ptr,type);
void va_end(va_list arg_ptr);
va在这里是variable-argument(可变参数)的意思. 这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件。
下面写一个简单的可变参数的函数,改函数至少有一个整数参数,第二个参数也是整数,是可选的。函数只是打印所有的参数的值。
#include <iostream>
#include <stdarg.h>
using namespace std;
void simple_va_fun(int i, ...){
va_list arg_ptr;
va_start(arg_ptr, i);
for(int j=0;j<i;j++){
int tmp=va_arg(arg_ptr, int);
cout<<tmp<<" ";
}
cout<<endl;
va_end(arg_ptr);
}
int main(){
simple_va_fun(3,2,3,4);
simple_va_fun(5,2,3,4,5,6);
system("pause");
}
1)首先在函数里定义一个va_list型的变量arg_ptr,这个变量是指向参数的指针。
2)用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
3)用va_arg返回可变的参数,并赋值给整数tmp,va_arg的第二个参数是你要返回的参数的类型,这里是int型。
4)最后用va_end宏结束可变参数的获取,然后就可以在函数里使用这些参数了。函数有多个可变参数的,依次调用va_arg获取各个参数。
可变参数的函数的宏源码解析
va_list、va_start、va_arg、va_end这几个宏,都是用于函数的可变参数的。
1、va_list用于声明一个变量,我们知道函数的可变参数列表其实就是一个字符串,所以va_list才被声明为字符型指针,这个类型用于声明一个指向参数列表的字符型指针变量。
2、va_start(ap,v),它的第一个参数是指向可变参数字符串的变量,第二个参数是可变参数函数的第一个参数,通常用于指定可变参数列表中参数的个数。
3、va_arg(ap,t),它的第一个参数指向可变参数字符串的变量,第二个参数是可变参数的类型。
4、va_end(ap),用于将存放可变参数字符串的变量清空(赋值为NULL)。
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
//第一个参数指定了参数的个数
int sum(int number,...){
va_list vaptr;
int i;
int sum = 0;
va_start(vaptr,number);
for(i=0; i<number;i++){
sum += va_arg(vaptr,int);
}
va_end(vaptr);
return sum;
}
int main(){
printf("%d\n",sum(4,4,3,2,1));
system("pause");
}