当前位置: C语言 -- 标准库 -- <stdarg.h> -- va_start

va_start宏


概要:
#include <stdarg.h>
void va_start(va_list ap, parmN);

描述:

va_start应作为宏而不是函数来实现;宏va_start是函数式宏,可用于初始化可变参数列表。

访问未命名参数前,应调用宏va_start。宏va_start初始化ap以供后续宏va_argva_end使用。对于同一ap,如果没有调用宏va_end结束其使用,则不应该调用宏va_start或者va_copy重新初始化ap。同一函数中宏va_start和宏va_copy的每次调用都应与对应的va_end宏调用相匹配。

参数parmN是函数定义可变参数列表中最右边参数的标识符,即, ...之前的参数的标识符。如果参数parmN声明时使用了register存储类说明符、类型为函数类型或者数组类型、或者类型为与默认参数提升(default argument promotions)后的结果类型不兼容的类型,其行为是未定义的。


参数:
va_list ap

未初始化的va_list类型对象。

parmN

函数定义可变参数列表中最右边参数的标识符,即, ...之前的参数的标识符。


返回值:

该宏无返回值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
/*宏va_start范例*/

#include <stdarg.h>
#include <stdio.h>

void summation(int N, ...)
{
    int sum = 0;
    int integer;
    va_list number;

    va_start(number, N);
    
    /*读取N个参数。*/
    for(int i=0; i<N; ++i)
    {
        integer = va_arg(number,int);
        sum += integer;
    }

    va_end(number);
    
    printf("sum = %d\n", sum);
}

int main(void)
{
    summation(5,15,22,37,46,74);

    return 0;
}

输出:

sum = 194


相关内容:
va_list 保存可变参数信息的类型。
va_arg 获取下一个参数的宏。
va_copy 复制可变参数列表的宏。
va_end 结束使用可变参数列表的宏。