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

时间:2010-09-09 13:46:11

标签: c

PHP有一个func_get_args()用于获取所有函数参数,而JavaScript有functions个对象。

我在C

中写了一个非常简单的max()
int max(int a, int b) {

    if (a > b) {
        return a;   
    } else {
        return b;
    }
}

我很确定在大多数语言中你可以为他们内置的max()(或等价物)提供任意数量的参数。你能用C做这个吗?

我认为question可能是我想要的,但我认为不是。

请记住我还在学习。 :)

非常感谢。

7 个答案:

答案 0 :(得分:10)

您可以编写一个带参数数量的变量参数函数,例如

#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_arg调用)。

答案 1 :(得分:5)

是的,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;
}

输出:

Maximum is 97
Maximum is -2147483648

请注意quant变量的使用。通常有两种方式来指示参数的结束,可以是前计数(5),也可以是后面的标记值。

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

这是一个指向网站的链接,其中显示了在c Writing a ``varargs'' Function中使用varargs的示例

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

,你可以支持2个以上的参数

答案 4 :(得分:1)

是的,您可以在C中声​​明variadic函数。最常用的函数可能是printf,其声明如下所示

int printf(const char *format, ...);

...是声明它接受可变数量的参数的方式。

要访问这些参数,它可以使用va_startva_arg等通常是stdarg.h中定义的宏。见here

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

printf("%d");

答案 5 :(得分:1)

另一种方法是传入一个数组,如main()。例如:

int myfunc(type* argarray, int argcount);

答案 6 :(得分:0)

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

您已经知道一个:printf()

printf("Hello World\n");
printf("%s\n", "Hello World");
printf("%d + %d is %d\n", 2, 2, 2+2);

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

使用<stdarg.h>以及该标头中定义的va_listva_startva_argva_end标识符。

http://www.kernel.org/doc/man-pages/online/pages/man3/stdarg.3.html