可变参数功能

时间:2015-09-08 12:11:47

标签: c visual-studio-2013

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

int sum(int, ...);

int main(void)
{
    int answer = sum(4, 4, 3, 2, 1);
    printf("합은 %d입니다.\n", answer);

    return 0;
}

int sum(int num, ...)
{
    int answer = 0;
    va_list argptr;

    va_start(argptr, num);
    for (; num > 0; num--)
        answer += va_arg(argptr, int);

    va_end(argptr);
    return(answer);    
}

这是可变参数功能。我有一些问题。

什么是“stdarg.h”? 我无法从我的书中找到 va_listva_endva_start

1 个答案:

答案 0 :(得分:1)

标题“stdarg.h”是一个标准的C头,它声明了一些宏用于处理具有不同类型的不同参数的函数。声明的最重要的宏是va_listva_startva_endva_arg

va_list表示一个抽象数据类型,可以存储函数调用的“未命名”参数(由“...”捕获的参数)。要使用它,您必须先使用va_start()宏来初始化它:

va_list argptr; /* declaration of the unnamed arguments list */
va_start(argptr, num); /* the initialization of the list */

va_start()的第二个参数必须是函数的最后一个命名参数(在您的情况下,这是num,这是唯一提供的命名参数)。初始化之后,您可以使用argptr宏逐个从va_arg()列表中提取未命名的参数:

answer += va_arg(argptr, int); 

va_arg()的每次调用都会返回argptr中的下一个参数,将其解释为int(或作为va_arg()的第二个参数提供的任何其他类型)。请注意,没有类型检查,也无法确保调用者实际提供了正确类型的参数。

最后,应该在返回之前通过调用va_end(argptr)来释放列表。