C函数是否支持任意数量的参数?
PHP有一个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做这个吗 我想这可能是我想要的,
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的类型,依此类推)。因此,您不会得到一个看起来与您所希望的完全相同的varargmax
函数-这是C语言的一个限制。@Steve:您可以通过使用可变宏包装可变函数来解决这个问题,该宏对参数进行计数,并将计数作为第一个参数传递。:-)
printf("%d");
printf("Hello World\n");
printf("%s\n", "Hello World");
printf("%d + %d is %d\n", 2, 2, 2+2);