zoukankan      html  css  js  c++  java
  • 可变参函数

    简介:

      采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。例如

    printf(const char * _Format, ...);

    实现:

      C语言可变参数通过三个宏(va_start、va_end、va_arg)和一个类型(va_list)实现。

    typedef char *  va_list;
    
    #define va_start _crt_va_start
    #define va_arg _crt_va_arg
    #define va_end _crt_va_end
    
    #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
    //参数:ap为可变参的地址,v为确定的参数
    //功能:确定第一个可变参的地址(函数参数从右向左压栈)
    #define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
    //参数:ap为可变参的地址,t为可变参的类型
    //功能:获取可变参的值
    #define _crt_va_end(ap)      ( ap = (va_list)0 )
    //功能:将ap置空

    Demo:

    /* va_start example */
    #include <stdio.h>      /* printf */
    #include <stdarg.h>     /* va_list, va_start, va_arg, va_end */
    
    void PrintFloats(int n, ...)
    {
        int i;
        double val;
        printf("Printing floats:");
        va_list vl;
        va_start(vl, n);
        for (i = 0; i < n; i++)
        {
            val = va_arg(vl, double);
            printf(" [%.2f]", val);
        }
        va_end(vl);
        printf("
    ");
    }
    
    int main()
    {
        PrintFloats(3, 3.14159, 2.71828, 1.41421);
        return 0;
    }

    参考资料:

    http://www.cplusplus.com/reference/cstdarg/

  • 相关阅读:
    Python接口自动化之request请求封装
    AI缘起——达特茅斯会议
    AirtestProject测试框架
    强化学习落地:竞态场景下基于锁机制的闲置端口查用
    多智能体强化学习入门Qmix
    代码回滚----git reset 和 git revert 使用
    requestAnimationFrame
    深度剖析-事件循环event
    Ubuntu18.04安装ES也就是ELK
    Ubuntu18.04+kafka
  • 原文地址:https://www.cnblogs.com/codelu/p/4854512.html
Copyright © 2011-2022 走看看