【发布时间】:2012-07-02 07:27:03
【问题描述】:
在学习 C 时,我看到 printf 在传递时可以接收许多参数。
而且我不知道 C 如何实现这样的函数,用户可以输入任意数量的参数。我也考虑过指针,但仍然没有好主意。如果有人对此类函数有任何想法,请告诉我。
【问题讨论】:
标签: c parameters variadic-functions
在学习 C 时,我看到 printf 在传递时可以接收许多参数。
而且我不知道 C 如何实现这样的函数,用户可以输入任意数量的参数。我也考虑过指针,但仍然没有好主意。如果有人对此类函数有任何想法,请告诉我。
【问题讨论】:
标签: c parameters variadic-functions
需要用到va_args、va_list等。 看看这个教程。 http://www.cprogramming.com/tutorial/c/lesson17.html
这应该会有所帮助。
【讨论】:
您必须在函数声明中使用... 符号作为最后一个参数。
请参阅本教程以了解更多信息:http://www.cprogramming.com/tutorial/c/lesson17.html
【讨论】:
#include <stdarg.h>
#include <stdio.h>
int add_all(int num,...)
{
va_list args;
int sum = 0;
va_start(args,num);
int x = 0;
for(x = 0; x < num;x++)
sum += va_arg(args,int);
va_end(args);
return sum;
}
int main()
{
printf("Added 2 + 5 + 3: %d\n",add_all(3,2,5,3));
}
【讨论】:
您使用 C varargs 编写了一个可变参数函数。您需要包含stdargs.h,它为您提供了用于迭代未知大小的参数列表的宏:va_start、va_arg 和va_end,使用数据类型:va_list。
这是一个几乎没用的函数,它打印出它的可变长度参数列表:
void printArgs(const char *arg1, ...)
{
va_list args;
char *str;
if (arg1) We
va_start(args, arg1);
printf("%s ", arg1);
while ((str = va_arg(argp, char *)) != NULL)
printf("%s ", str);
va_end(args);
}
}
...
printArgs("print", "any", "number", "of", "arguments");
Here's 一个更有趣的例子,它展示了你可以多次迭代参数列表。
请注意,使用此功能存在类型安全问题; wiki article 解决了其中的一些问题。
【讨论】: