美文网首页修行、工作和生活
va_list 可变参数用法及定义

va_list 可变参数用法及定义

作者: eversay | 来源:发表于2021-06-10 00:35 被阅读0次

可变参数用法

int func(int v,...)
{
    int tmp;
    va_list ap;
    va_start(ap,v);
    tmp = va_arg(ap,int);//若有多个可变参数,依次调用va_arg可返回参数
    va_end(ap);
}

void var_args_func(const char * fmt, ...) 
{
    va_list ap;
    va_start(ap, fmt);
    printf("%d\n", va_arg(ap, int));
    printf("%f\n", va_arg(ap, double));
    printf("%s\n", va_arg(ap, char*));
    va_end(ap);
}

int main()
{
    var_args_func("%d %d %s\n", 4, 5, "hello world");
    return 0;
}

上面是va_list的具体用法,下面讲解一下va_list各个语句含义和 va_list的实现。
可变参数实际上是由宏实现的,但是由于平台的不同,编译器的不同,宏的定义也不相同,下面是VC6.0中x86平台的定义:

定义及va_list 的实现

typedef char * va_list;        // TC中定义为void*
#define _INTSIZEOF(n)        ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) //为了满足需要内存对齐的系统
 #define va_start(ap,v)        ( ap = (va_list)&v + _INTSIZEOF(v) )     //ap指向第一个变参的位置,即将第一个变参的地址赋予ap
#define va_arg(ap,t)       ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )   /获取变参的具体内容,t为变参的类型,如有多个参数,则通过移动ap的指针来获得变参的地址,从而获得内容/
#define va_end(ap) ( ap = (va_list)0 )   //清空va_list,即结束变参的获取

相关文章

  • va_list 可变参数用法及定义

    可变参数用法 上面是va_list的具体用法,下面讲解一下va_list各个语句含义和 va_list的实现。可变...

  • C传递可变参数

    C传递可变参数 va_list   va_list配合va_start/va_arg/va_end宏定义, 可以完...

  • C/C++可变参数

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

  • 22.可变参数

    可变参数的用法

  • iOS可变参数va_list

    看一下系统UIAlertView里面的一个方法。 在方法的最尾部有... 省略号用来添加其他弹唱按钮,看一下实现方...

  • IOS可变参数(va_list)

  • va_list 可变参数概览

    前言 VA_LIST 解决变参问题的一组宏,所在头文件:#include ,用于获取不确定个数的参数 比如我们最...

  • Python 学习杂记

    可变参数 可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个 定义可变参数和定义一个lis...

  • iOS 可变参数va_list处理

    前言 某些特殊情况需要传不确认个数的变量会用到va_list来处理。我google了一下va_list文章,都是千...

  • iOS可变参数(va_list)处理

    编写一些通用类的时候经常会遇到可变参数的处理。就好比 :UIAlertView的init方法中的otherButt...

网友评论

    本文标题:va_list 可变参数用法及定义

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