可变参函数

简介:

  采用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("\n");
}

int main()
{
    PrintFloats(3, 3.14159, 2.71828, 1.41421);
    return 0;
}

参考资料:

http://www.cplusplus.com/reference/cstdarg/

posted on 2015-10-04 14:19  微末凡尘12138  阅读(175)  评论(0编辑  收藏  举报

导航