Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变参数函数_C_Visual Studio 2013 - Fatal编程技术网

C 变参数函数

C 变参数函数,c,visual-studio-2013,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;

考虑:

#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);
}
#包括
#包括
整数和(整数,…);
内部主(空)
{
int-answer=sum(4,4,3,2,1);
printf(“합은 %D입니다.\n“,答案);
返回0;
}
整数和(整数,…)
{
int-answer=0;
va_列表参数;
va_开始(argptr,num);
对于(;num>0;num--)
答案+=va_arg(argptr,int);
va_端(argptr);
返回(回答);
}
这是一个可变参数函数

什么是“
stdarg.h
”?我在关于
va_list
va_end
va_start
的书中找不到它。标题“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 */
answer += va_arg(argptr, int); 
va_start()
的第二个参数必须是函数的最后一个命名参数(在您的例子中,这是
num
,这是唯一提供的命名参数)。初始化后,可以使用
va_arg()
宏从
argptr
列表中逐个提取未命名的参数:

va_list argptr; /* declaration of the unnamed arguments list */
va_start(argptr, num); /* the initialization of the list */
answer += va_arg(argptr, int); 
每次调用
va_arg()
都会返回
argptr
中的下一个参数,将其解释为
int
(或作为
va_arg()
的第二个参数提供的任何其他类型)。请注意,没有类型检查,也无法确保调用方实际提供了正确类型的参数


最后,在返回之前,应该通过调用<代码> VAYEnter(AgpTR)来发布列表。

可以看出,不同意“C++中的变量数是一个好的副本1”是标记C++而不是C。2) “变量函数”是一个评价很高的答案@chux同意,我不认为这是一个好的dup,我不认为我见过这个问题的C版本。你在用什么书?它可能是过时的,也可能是完全错误的,或者你可能看错了地方。