arg 在定义为 int function(int arg, ...) 的变量参数函数中的作用是什么?

What is the role of arg in variable argument function defined as int function(int arg, ...)?

提问人:tycoon 提问时间:3/29/2022 最后编辑:tycoon 更新时间:3/30/2022 访问量:50

问:

我正在学习 C 语言中的变量参数函数,我遇到了使用不同命名参数的不同代码(根据某些网站的注入器消息)。, .我尝试运行以下代码。int function(int count, ...)int function(char *string, ...)

#include <stdio.h>
#include <stdlib.h>

#include <stdarg.h>
#include <string.h>

int addition(int count, ...)
{
    va_list values;
    va_start(values, count);

    int sum = 0;

    for (int i = 0; i < count + 2; i++)
    {
        sum += va_arg(values, int);
    }

    return sum;
}

int main(void)
{
    int sum = average(3,12,23,43,65,12);

    printf("%d\n", sum);
    return 0;
}

它再次成功运行。通过编写上面的代码,我无意进行添加,但只是为了了解命名参数(count)的作用,有几点让我持怀疑态度。

我认为命名参数是传递给可变参数函数的参数数量。但是在计算一个函数并使用上述代码之后,我很清楚这不是它的作用。int function(char *string, ...)

在上面的函数中,我可以在 for 循环中传递 count+2 来查找总和,并且可以得到与预期相同的结果,因此很明显,命名参数的重要性取决于代码的功能。

在许多情况下,人们希望将变量计数传递给可变参数函数,例如取平均值或传递 char* 以创建输入函数(如 scanf)。但是在同一个地方,在某些情况下可能不需要任何命名参数(我不知道任何示例,但我相信可能有一些情况)

我认为使用命名参数的原因可能在于编译器无法确定传递的参数是否为命名参数。但是通过删除平均函数中的命名参数,我收到编译器错误,即没有传递命名参数。因此,编译器可以区分命名参数和变量参数。这也可以通过将加法函数的声明更改为 来说明,通过执行此操作,编译器将给出错误,即 int count 不是最后一个命名的参数。int average(...)int addition(int count, int another, ...)

我唯一不明白的是,为什么命名参数是必要的,即使它不一定会影响程序的工作(据我所知)。由于编译器可以区分命名参数和变量参数,因此可以使用此功能创建一个仅接受变量参数的函数和一个同时接受具有命名参数的可变参数函数。

va_start 将命名参数作为第二个参数,在这个网站上它声明 据我了解,这意味着第二个参数是告诉编译器参数 paramN 之后的参数是变量参数,但我认为编译器已经知道哪个参数是哪个。 void va_start (va_list ap, paramN); Initializes ap to retrieve the additional arguments after parameter paramN.

c 可变函数

评论

0赞 Barmar 3/29/2022
该角色可以是您想要的任何内容。它是格式字符串,它从字符串中的操作数派生其他参数的数量。printf()%
3赞 Eugene Sh. 3/30/2022
在这种情况下,我第一次听到“喷油器消息”一词。也找不到使用它的任何资源。所以你可能也不应该这样做。
0赞 Barmar 3/30/2022
va_start()需要一个参数名称才能将其链接到参数列表。
0赞 tycoon 3/30/2022
@Barmar是的,但该列表在这里是值,而不是第二个参数在va_start中的作用,即这里的计数
3赞 Barmar 3/30/2022
原因几乎可以肯定是历史性的,从之前被添加到语言中。它是一个宏,用于在堆栈帧中查找附加参数的位置。...&paramN

答: 暂无答案