#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_list
,va_end
,va_start
?
答案 0 :(得分:1)
标题“stdarg.h”是一个标准的C头,它声明了一些宏用于处理具有不同类型的不同参数的函数。声明的最重要的宏是va_list
,va_start
,va_end
和va_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)
来释放列表。