美文网首页
C可变参数学习

C可变参数学习

作者: 水清波 | 来源:发表于2019-06-19 17:17 被阅读0次
int sum(int cnt, ...){
    va_list vl;
    va_start(vl, cnt);
    int tmp, sum = 0;
    for (int i = 0; i < cnt; i++)
    {
        tmp = va_arg(vl, int);
        sum += tmp;
    }

    va_end(vl);
    return sum;
}

源码分析

typedef char *  va_list;

va_list是个char指针

#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define _ADDRESSOF(v)   ( &reinterpret_cast<const char &>(v) )

ap获取了v的地址,并跳过v的长度,指向了后一个单位

#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

ap跳过v大小并返回前一个单位的地址,转为t的类型,获得内容

#define _crt_va_end(ap)      ( ap = (va_list)0 )

ap制空,结束

sprintf也是类似的规则,但是底层源码是库源码。

可以参考别人的 自适应 sprintf源码
https://blog.csdn.net/echoisland/article/details/6086406

相关文章

  • C++语言之this原理与友元函数友元类

    1.C++可变参数。java 可变参数 int...C++ 可变参数 ... 需要引入头文件 stdarg.h头文...

  • Swift 调用 Objective-C 的可变参数函数

    Swift 调用 Objective-C 的可变参数函数 Swift 调用 Objective-C 的可变参数函数

  • C可变参数学习

    源码分析 va_list是个char指针 ap获取了v的地址,并跳过v的长度,指向了后一个单位 ap跳过v大小并返...

  • C 可变参数

    函数的可变参数语法如下: 函数 func() 最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是...

  • Lua可变参数

    Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用...表示函数有可变的参数。 把可变参数...

  • iOS变参函数的实现(Objective-C and Swift

    Objective-C 可变参数的函数在Objective-C中不罕见,像Cocoa中的很多常见的函数都是可变参数...

  • Java中的可变参数

    学习笔记:可变参数,仅语法 可变参数又称参数的个数可变,用作方法形参的出现,那么方法的参数个数就是可变的了. 格式...

  • C/C++可变参数

    C/C++中支持传递可变参数,即不定参数,例如: 那么如何拿到不定参数,需要借助va_list类型,包含在cstd...

  • va_list 可变长参数原理

    在 c 语言中,我们可以使用可变参数来传入多个参数,比如 printf 函数。可变参数的函数需至少定义一个参数值,...

  • C语言----可变参数

    有时,可能会碰到这样的情况,希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方...

网友评论

      本文标题:C可变参数学习

      本文链接:https://www.haomeiwen.com/subject/tinkqctx.html