可变参数的C函数

2015/08/02 C和C++基础

如何写一个简单的可变参数的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");
}

Search

    Post Directory