zoukankan      html  css  js  c++  java
  • 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]!=''){
            
            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
    ",i,j);
        func("%d be equal %f
    ",i,j);
        
    
    }
  • 相关阅读:
    hadoop集群配置和测试
    ubuntu 12.04安装jdk
    springboot集成mybatis
    redis连接数据库
    生产随机数
    关于字符串统计次数
    闲的无聊写了一个房租的后台
    简单的死锁
    java集合类总结(转)
    mybatis框架的搭建
  • 原文地址:https://www.cnblogs.com/happykoukou/p/9087100.html
Copyright © 2011-2022 走看看