Loading

c动态参数实现

c动态参数实现

标准库stdarg.h

下面出自 vadefs.h

     typedef char* va_list;
     #define _ADDRESSOF(v) (&(v))
     #define _INTSIZEOF(n)          ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1)) //剩余定理
     #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))
     #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
     #define __crt_va_end(ap)        ((void)(ap = (va_list)0))
    #include <stdarg.h>
    #include <stdio.h>
    int Add(int n, ...)
    {
        va_list arg_ptr; // 参数指针
        int add = 0, number = 0; // 初始化
        va_start(arg_ptr,&n); //取固定末尾参数地址
       for (size_t i = 1; i < n+1; i++)
       {
           /* code */
           number = va_arg(arg_ptr,int); //移动参数指针,并返回数据
           add += number;
       }
        va_end(arg_ptr); //清除参数指针
        return add;
    }
    int main()
    {
        printf("%d\n",Add(2,1,3));
        return 0;
    }

动态参数实现过程:

  • 通过固定参数获取被调函数栈中推入的非固定参数个数与类型
  • 依照规则依次读取栈中非固定参数
  • 基本运算
  • 清除读取所用参数指针
  • 返回结果

参考链接

C 可变参数函数的本质

posted @ 2020-11-29 11:01  流缘飞雨  阅读(451)  评论(0)    收藏  举报