#include <stdarg.h>
double average(int count, ...)
{
va_list ap;
int j;
double tot = 0;
va_start(ap, count); //Requires the last fixed parameter (to get the address)
for(j=0; j<count; j++)
tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
va_end(ap);
return tot/count;
}
#include <stdio.h>
#include <stdarg.h>
int sum(int count, ...)
{
int total, i, temp;
total = 0;
va_list args;
va_start(args, count);
for(i=0; i<count; i++)
{
temp = va_arg(args, int);
total += temp;
}
va_end(args);
return total;
}
int main()
{
int numbers[3] = {5, 10, 15};
// Get summation of all variables of the array
int sum_of_numbers = sum(3, numbers[0], numbers[1], numbers[2]);
printf("Sum of the array %d\n", sum_of_numbers);
// Get summation of last two numbers of the array
int partial_sum_of_numbers = sum(2, numbers[1], numbers[2]);
printf("Sum of the last two numbers of the array %d\n", partial_sum_of_numbers);
return 0;
}
〉mode_t == unsigned short 相当于: curPara = (mode_t) va_arg(argList, unsigned short); 所以编译器警告: Second argument to 'va_arg' is of promotable type 'mode_t' (aka 'unsigned short'); this va_arg has undefined behavior because arguments will be promoted to 'int' 变更为: curPara = (mode_t) va_arg(argList, unsigned int); 可以避免警告。
7条答案
按热度按时间twh00eeo1#
它允许未指定类型的变量数量(如
printf
)。您必须使用
va_start
、va_arg
和va_end
函数访问参数。有关详细信息,请参见http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html或Where in the C standard variadic functions are described?
ibrsph3r2#
变分函数
可变参数函数是可以采用可变数量的参数的函数,并且用省略号代替最后一个参数来声明。这种函数的一个例子是
printf
。一个典型的声明是
变量函数必须至少有一个命名参数,例如,
在C中不允许。
hwamh0ep3#
变元函数(多参数)
维基
jhkqcmku4#
三个点。..'被称为省略号。在函数中使用它们会使该函数成为一个变量函数。在函数声明中使用它们意味着函数将接受已定义参数之后的任意数量的参数。
例如:
都是有效的函数调用,但以下不是:
9rnv2umw5#
这意味着正在声明一个可变参数函数。
brgchamk6#
以
...
作为最后一个参数的函数称为变分函数(Cppreference)。这个...
用于允许具有未指定类型的可变长度参数。当我们不确定参数的数量或类型时,可以使用可变参数函数。
**变量函数示例:**假设我们需要一个sum函数,它将返回变量个数的和。我们可以在这里使用变分函数。
输出:
**练习题:**一个练习变元函数的简单题,可以在hackerrank practice problem here中找到
参考:
gblwokeq7#
...
=三个点=三个点=调用:ellipsis
...
帕拉调用函数:变分函数变元函数
定义
int validFunctionWithNamedParameterThenEllipsis(int a, double b, ...);
int invalidFunctionOnlyEllipsis(...);
示例
热门案例:
电话:
format
=="year=%d, name=%s"
...
==2021, "crifan"
2021
"crifan"
如何获取/计算Variadic函数的参数
va_list
,搭配va_start
、va_arg
、va_end
相关定义
示例
平均
maxof
执行
我的案例:hook syscall()
注意事项
va_start
当调用
va_start
时,last_arg
是最后一个命名的参数,而不是第一个适用于:
int open(const char *path, int oflag, ...);
va_start(argList, oflag);
va_start(argList, path);
Second argument to 'va_start' is not the last named parameter
va_arg
type va_arg(va_list ap, type);
对于pass
type
,存在特殊情况:传入时:
但return总是:
*unsigned int
curPara = (mode_t) va_arg(argList, mode_t);
根据:
mode_t
==unsigned short
相当于:
curPara = (mode_t) va_arg(argList, unsigned short);
所以编译器警告:
Second argument to 'va_arg' is of promotable type 'mode_t' (aka 'unsigned short'); this va_arg has undefined behavior because arguments will be promoted to 'int'
变更为:
curPara = (mode_t) va_arg(argList, unsigned int);
可以避免警告。
相关单据