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/

  • 相关阅读:
    BZOJ4036 HAOI2015按位或(概率期望+容斥原理)
    洛谷p2661信息传递题解
    洛谷P1434滑雪题解及记忆化搜索的基本步骤
    二分图最大匹配
    线段树

    图论基本算法
    并查集
    RMQ--ST表
    矩阵快速幂和矩阵乘法
  • 原文地址:https://www.cnblogs.com/codelu/p/4854512.html
Copyright © 2011-2022 走看看