c /c++变参函数(转)

原文转自 https://blog.csdn.net/wwzcx/article/details/8940092

 

实现c/c++语言的变参函数。

变参函数 :void fun(para,...)

变参函数必须要有一个固定参数。

 

在头文件stdarg.h中定义了三个宏可以用到:     
void    va_start(va_list    arg, prev_param    );    

type    va_arg(va_list    arg, type    );    

void    va_end(va_list    arg    );   

 
va在这里是variable-argument(可变参数)的意思.     

那么变参函数的实现就变得相对简单很多。

一般的变参函数处理过程:

①定义一个va_list变量设为va

②调用va_start()使得va存放变参函数的变参前的一个固定参数的地址。

③不断调用va_arg()使得va指向下一个变参。

④最后调用va_end()表示变参处理完成。

 原理就是:函数的参数在内存中从低地址向高地址依次存放。

看一个例子:模仿pritnf的实现:

#include<iostream>
#include<stdarg.h>
#include<string.h>
using namespace std;

void func(char *c,...){
    
    int i=0;
    double result=0;
    va_list arg;    //va_list变量
    va_start(arg,c);    //arg指向固定参数c
    while(c[i]!='\0'){
        
        if(c[i]=='%'&&c[i+1]=='d'){
            printf("%d",va_arg(arg,int));
            i++;
        }
        else if(c[i]=='%'&&c[i+1]=='f'){
            printf("%f",va_arg(arg,double));
            i++;
        }    
        else {
            char newc[2] = {c[i]};    //将字符转换为字符串输出,也可以用putchar()
            printf("%s",newc);
        }    
        i++;
    }
    va_end(arg);
}


int main(){
    int i=100;
    double j=100.0;
    printf("%d be equal %f\n",i,j);
    func("%d be equal %f\n",i,j);
    

}

 

posted @ 2018-05-25 10:30  ~小小鸟~  阅读(433)  评论(0编辑  收藏  举报