C函数是否支持任意数量的参数?

C函数是否支持任意数量的参数?,c,C,PHP有一个func\u get\u args()用于获取所有函数参数,JavaScript有functions对象 我用C编写了一个非常简单的max() int max(int a, int b) { if (a > b) { return a; } else { return b; } } 我敢肯定,在大多数语言中,您都可以为其内置的max()(或等效)提供任意数量的参数。你能用C做这个吗 我想这可能是我想要的,

PHP有一个
func\u get\u args()
用于获取所有函数参数,JavaScript有
functions
对象

我用C编写了一个非常简单的
max()

int max(int a, int b) {
    
    if (a > b) {
        return a;   
    } else {
        return b;
    }
}
我敢肯定,在大多数语言中,您都可以为其内置的
max()
(或等效)提供任意数量的参数。你能用C做这个吗

我想这可能是我想要的,但我不这么认为

请记住,我也在学习。:)


非常感谢。

是的,C有可变函数的概念,这类似于
printf()
允许可变数量的参数

最大值函数如下所示:

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

static int myMax (int quant, ...) {
    va_list vlst;
    int i;
    int num;
    int max = INT_MIN;

    va_start (vlst, quant);

    for (i = 0; i < quant; i++) {
        if (i == 0) {
            max = va_arg (vlst, int);
        } else {
            num = va_arg (vlst, int);
            if (num > max) {
                max = num;
            }
        }
    }
    va_end (vlst);
    return max;
}

int main (void) {
    printf ("Maximum is %d\n", myMax (5, 97, 5, 22, 5, 6));
    printf ("Maximum is %d\n", myMax (0));
    return 0;
}
注意
quant
变量的使用。通常有两种方法来表示参数的结束,一种是前面的计数(5),另一种是后面的哨兵值

后者的一个例子是指针列表,将
NULL
作为最后一个指针传递。由于此
max
函数需要能够处理整个整数范围,因此sentinel解决方案不可行


printf
函数使用前一种方法,但略有不同。它没有特定的计数,而是使用格式字符串中的
%
字段来计算其他参数。

这里是一个指向站点的链接,显示了在c中使用varargs的示例


可以使用va_args函数检索传递给函数的可选参数。使用它可以传递0-n个可选参数。因此,如果选择

,您可以支持2个以上的参数。例如,您可以编写一个变量arguments函数,该函数接受参数的数量

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

int sum(int numArgs, ...)
{
    va_list args;
    va_start(args, numArgs);

    int ret = 0;

    for(unsigned int i = 0; i < numArgs; ++i)
    {
        ret += va_arg(args, int);
    }    

    va_end(args);

    return ret;
}    

int main()
{
    printf("%d\n", sum(4,  1,3,3,7)); /* prints 14 */
}
#包括
#包括
整数和(整数单位,…)
{
va_列表参数;
va_开始(args、numArgs);
int-ret=0;
for(无符号整数i=0;i
该函数假定每个变量参数都是整数(请参见
va_arg
call)

是的,您可以用C语言声明函数。最常用的可能是
printf
,它的声明如下所示

int printf(const char *format, ...);
是它声明接受可变数量参数的方式

要访问这些参数,它可以使用
va_start
va_arg
等,它们通常是
stdarg.h
中定义的宏。看

可能还值得注意的是,您经常会“混淆”这样的函数。例如,以下对
printf
的调用将打印调用时堆栈顶部发生的任何内容。实际上,这可能是保存的堆栈基指针

printf("%d");

事实上,这是两个问题。首先,C99只要求C实现至少可以处理:

  • 一个函数中有127个参数 定义
  • 一个函数调用中有127个参数

现在,对于你真正的问题,是的,C99中有所谓的可变函数和宏。声明的语法在参数列表中带有
..
。可变函数的实现与来自
stdarg.h
头文件的宏一起进行。

C
可以让函数接收任意数量的参数

您已经知道一个:
printf()

没有接受任意数量参数的
max
函数,但这是一个很好的练习,您可以编写自己的参数

使用
和该标题中定义的
va_列表
va_开始
va_参数
va_结束
标识符


另一种选择是传入数组,如
main()
。例如:


int-myfunc(类型*argarray,int-argcount)

这是
max
的一个相当奇怪的实现…)谢谢,但是
max()
的意思是返回最大的数字,而不是将它们相加:PDo我必须告诉函数我发送了多少个参数
printf()
似乎不想知道,但我想它可以计算出第一个参数中的所有格式字符。@AndiDog:您仍然将它作为对
max
的调用,而不是
printf
语句中的
sum
。@alex:是的,您必须这样做。但是你可以用宏来解决这个问题。例如,可以使用sentinel值INT_MIN来阻止函数遍历参数。然后您可以定义一个可变宏(请注意,并非所有编译器都支持该宏)
\define max(…)maxfunction(\uu VA_ARGS,uu,INT_MIN)
。请注意,与PHP和Javascript不同,使用C varargs时,您的函数需要能够从非可变ARGS的值计算出varargs的类型和数量(或者我猜您可以从非var参数计算出第一个VARAG的类型,然后从第一个值计算出第二个VARAG的类型,依此类推)。因此,您不会得到一个看起来与您所希望的完全相同的vararg
max
函数-这是C语言的一个限制。@Steve:您可以通过使用可变宏包装可变函数来解决这个问题,该宏对参数进行计数,并将计数作为第一个参数传递。:-)
printf("%d");
printf("Hello World\n");
printf("%s\n", "Hello World");
printf("%d + %d is %d\n", 2, 2, 2+2);