• C语言头文件stdarg.h(cstdarg)


    镇楼图

    Pixiv:KiTA



    在c语言不断发展中这个头文件有了什么变化?

    ·在C++时改名为cstdarg

    ·在C++11时新增加内容


    创建可变函数

    stdarg库允许你创建一个可变数量的参数的函数

    参数列表一般会在最后加上省略号...

    int sum(int n,...)
    //这里函数功能假设要求解n个参数的和
    

    这个库是通过栈来实现的,首先要创建一个栈的指针,这个类型为va_list

    va_list p;
    

    创建好后需要使用va_start宏来赋予地址

    va_start(p,n);
    //第一个参数为va_list型
    //第二个参数为可变参数的形式参数
    

    目前va_list会指向第一个参数

    然后需要通过循环将第二个参数不断推进到最后一个参数

    需要使用va_arg宏

    va_arg(p,int);
    //第一个参数为va_list型
    //第二个参数为下一个参数的类型,即可变参数的类型
    

    首先会返回当前参数数据,然后指向下一参数

    经历一系列循环后需要使用va_end来释放

    va_end(p);
    //参数为va_list型
    
    int sum(int n,...){
    	va_list p;
        va_start(p,n);
        int sum = 0;
        while(n--){
            sum += va_arg(p,int);
        }
        va_end(p);
        return sum;
    }
    

    假如一个函数要实现多种功能,同一个va_list肯定是不够用的,可以使用va_copy函数实现复制

    va_list p1,p2;
    va_start(p1,int);
    //...经过一系列操作
    va_copy(p1,p2);
    //两个均为va_list型,会将第一个va_list复制给第二个va_list(会从当前位置开始)
    

    当然这个函数有些多余,也可以直接赋值

    va_list p1,p2;
    va_start(p1,n);
    //...经过一系列操作
    p2 = p1;
    //如果要从头开始的参数表也可以va_start(p2,n)
    

    部分问题

    1.注意类型提升问题

    2.确定参数个数目前只有两种方法:一种是在最开始参数得出个数,一种是定义特殊值,只要参数扫描到特殊值就结束(比如'\0'或是NULL)

    3.va_end不是简单地将va_list置为NULL



    参考资料:

    cplusplus

    cppreference

  • 相关阅读:
    浏览器 窗口 scrollTop 的兼容性问题
    document.documentElement.scrollTop || document.body.scrollTop;
    javascript函数querySelector
    :before和:after的内幕以及伪类
    css伪类伪元素
    JavaScript 运动框架 Step by step
    js中style,currentStyle和getComputedStyle的区别
    js函数变量
    函数
    oracle语法练习
  • 原文地址:https://www.cnblogs.com/AlienfronNova/p/14528748.html
Copyright © 2020-2023  润新知