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

va_arg宏


概要:
#include <stdarg.h>
type va_arg(va_list ap, type);

描述:

va_arg应作为宏而不是函数来实现;宏va_arg是函数式宏,将扩展为一个表达式,该表达式具有函数调用中下一个实际参数的值和参数type指定的类型。

参数ap应已使用宏va_start或者va_copy初始化,并且没有调用宏va_end结束使用ap。每次调用宏va_arg都会修改参数ap,以便依次返回连续参数的值。参数type应是一个指定的类型名,type *可构成指向type类型对象的指针类型。


如果不存在实际的下一个参数,或者如果参数type与实际的下一个参数的类型不兼容(根据默认参数提升规则提升后),其行为是未定义的,下述两种情况除外:

- 一种类型是有符号整数类型,另一种类型是对应的无符号整数类型,并且值用这两种类型均能表示。

- 一种类型是void类型指针,另一种类型是字符类型指针。


参数:
va_list ap

va_list类型对象。

type

类型名。


返回值:

调用宏va_start后第一次调用宏va_arg,将返回参数parmN(参数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_arg范例*/

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

void maximumValue(int N, ...)
{
    int maximum, temp;
    va_list number;

    va_start(number, N);
    maximum = va_arg(number, int);

    for(int i=0; i<N-1; ++i)
    {
        temp = va_arg(number,int);
        if(maximum<temp)
            maximum = temp;
    }

    va_end(number);

    printf("The maximum value: %d\n", maximum);
}

int main(void)
{
    maximumValue(5,15,65,37,46,74);

    return 0;
}

输出:

The maximum value: 74


相关内容:
va_list 保存可变参数信息的类型。
va_copy 复制可变参数列表的宏。
va_end 结束使用可变参数列表的宏。
va_start 初始化可变参数列表的宏。