C 语言的可变参数表函数的设计

原创 2018年02月02日 14:03:48

大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()等

  可变参数的实现:
  C语言头文件stdarg.h提供了一个数据类型va-list和三个宏(va-start、va-arg和va-end),va—start使vp指向第一个可选参数。va—arg返回参数列表中的当前参数并使vp指向参数列表中的下一个参数。va—end把vp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va—start开始,并以va—end结尾。用它们在
被调用函数不知道参数个数和类型时对可变参数表进行测试,从而为访问可变参数提供了方便且有效的方法。va-list是一个char类型的指针,当被调用函数使用一个
可变参数时,它声明一个类型为va-list的变量,该变量用来指向va-arg和va-end所需信息的位置。
下面给出va_list在C中的源码:  

     typedef char * va_list; 

  采用ANSI标准形式时,参数个数可变的函数的原型声明是: 

   type funcname(type para1, type para2, ...) 

  这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分,type是函数返回值和形式参数的类型。

  调用者在实际调用参数个数可变的函数时,要通过一定的方法指明实际参数的个数,例如把最后一个参数置为空字符串。
  
  下面给出一个具体的例子:
求n个数的和:

int Sum(int n,...)
{
    int i = 0,sum = 0;
    va_list vp; 
    va_start(vp,n); //va—start使vp指向第一个可选参数
    for (i=0; i<n; i++)
    {
        sum +=va_arg(vp,int); 
    }
    va_end(vp); //va—end把vp指针清为NULLreturn sum;
}

printf函数实现(此处只实现了基本类型的打印)

void my_print(const char *format,...)
{
    char c = 0;
    va_list vp; 
    va_start(vp,format); //vp指向第一个可选参数
    while (*format)
    {
        c = *format;
        switch (c)
        {
        case '%':
            {
                char cc = *(++format);
                switch (cc)
                {
                case 'd':
                    {
                        char str[50];
                        int  n = va_arg(vp,int); //va—arg返回参数列表中的当前参数并使vp指向参数列表中的下一个参数。
                        char *string = _itoa(n,str,10); //把整数转为字符串
                        print_str(string);
                    }
                    break;
                case 'f':
                    {
                        char str[50];
                        double f = va_arg(vp,double);//va—arg返回参数列表中的当前参数并使vp指向参数列表中的下一个参数
                        char *string = _gcvt(f,10,str);//将浮点型数转换为字符串,取四舍五入
                        print_str(string);
                    }
                    break;
                case 'c':
                    putchar(va_arg(vp,char));
                    break;
                case 's':
                    {
                        char *string = va_arg(vp,char*);
                        print_str(string);
                    }
                    break;
                default:
                    break;
                }
            }
            break;
        default:
            putchar(c);
            break;
        }
        format++;
    }
    va_end(vp); //va—end把vp指针清为NULL。
}

要明白可变参数必须知道函数调用过程(栈帧的创建与销毁),此内容在前面的内容,文章地址:函数调用过程

版权声明:本文为博主原创文章,转载请私信博主。

嵌入式 C 语言的可变参数表函数的设计

首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理。 一、printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参...
  • skdkjxy
  • skdkjxy
  • 2014年10月22日 17:25
  • 443

C 语言的可变参数表函数的设计

转自:http://blog.csdn.net/hackbuteer1/article/details/7558979首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf...
  • goodmentc
  • goodmentc
  • 2013年09月01日 23:03
  • 556

C语言的可变参数表函数的设计

首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理。 一、printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参...
  • zjy1364503349
  • zjy1364503349
  • 2017年03月24日 18:45
  • 110

c语言的可变参数表函数的设计

首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理。 一、printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参...
  • xyw_1122
  • xyw_1122
  • 2017年03月23日 17:58
  • 320

C语言之传递可变参数

C语言之传递可变参数文章链接:知识点 传递int可变参数个数; 传递char类型可变参数个数; 传递logn类型可变参数个数; 传递可变参数个数特例; 新名词记录{stdarg.h, va_list,...
  • qq_16628781
  • qq_16628781
  • 2017年05月24日 22:18
  • 362

C语言学习小结--参数个数可变的函数

先来回顾一下C语言固定参数个数的函数形式:int func(int a, char b);可见,该函数有2个参数,分别是int型变量a和char型变量b。但是为什么标准输入输出库里面的printf函数...
  • mr_bean_1031
  • mr_bean_1031
  • 2017年07月23日 15:30
  • 233

关于C语言中printf函数的参数执行顺序

RT...看到有类似的题目
  • sy19901011
  • sy19901011
  • 2014年05月07日 20:23
  • 625

C语言0长度数组(可变数组/柔性数组)详解

C语言0长度数组(可变数组/柔性数组)详解 CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_ar...
  • gatieme
  • gatieme
  • 2017年03月20日 19:37
  • 1923

可变参数列表源码分析与实现

1,首先,怎么得到参数的值。对于一般的函数,我们可以通过参数对应在参数列表里的标识符来得到。但是参数可变函数那些可变的参数是没有参数标识符的,它只有“…”,所以通过标识符来得到是不可能的,我们只有另辟...
  • Quinn0918
  • Quinn0918
  • 2017年04月22日 19:11
  • 419

可变参数表函数的原理

引用一篇 http://www.cnblogs.com/liyou_blog/archive/2010/09/01/1814663.html
  • shengfanger
  • shengfanger
  • 2011年10月23日 14:48
  • 273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C 语言的可变参数表函数的设计
举报原因:
原因补充:

(最多只允许输入30个字)