2010-10-01 109 views
9

我们可以将可变数量的参数传递给c中的函数吗?传递可变数量的参数

+3

这样的函数称为[variadic函数](http://www.gnu.org/s/libc/manual/html_node/Variadic-Functions.html)(对于那些寻求好搜索关键字的人)。 – Seth 2010-10-01 03:11:45

+0

Thanks.It帮助我 – Shweta 2010-10-01 03:52:48

+0

你有没有使用'printf'? – dan04 2010-10-01 06:00:46

回答

11

Here是一个例子:

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

int maxof(int, ...) ; 
void f(void); 

int main(void){ 
     f(); 
     exit(EXIT SUCCESS); 
} 

int maxof(int n_args, ...){ 
     register int i; 
     int max, a; 
     va_list ap; 

     va_start(ap, n_args); 
     max = va_arg(ap, int); 
     for(i = 2; i <= n_args; i++) { 
       if((a = va_arg(ap, int)) > max) 
         max = a; 
     } 

     va_end(ap); 
     return max; 
} 

void f(void) { 
     int i = 5; 
     int j[256]; 
     j[42] = 24; 
     printf("%d\n", maxof(3, i, j[42], 0)); 
} 
+1

+1例如....我喜欢的例子... – Matthieu 2010-10-01 03:47:01

+1

我没有得到在这里使用'寄存器'? – haroldcampbell 2011-12-09 21:25:36

+0

“注册”的使用证明代码示例非常陈旧。作为性能优化,使用register是向编译器提示将变量放入机器寄存器的提示。过去30年来大多数C编译器都忽略了这个提示,因为它们可以比大多数程序员做得更好。现在,除了禁止计算变量的地址外,“寄存器”的影响很小。 – Peter 2017-07-21 13:44:15

0

是的,如果函数接受可变参数。如果您需要创建自己的变量参数函数,则以va_开头的宏可让您访问参数。

+0

不完全错误,但不是很有帮助。 – 2017-07-21 13:32:33

0

确保变量参数列表应该总是在参数列表的末尾

例如:void func(float a, int b, ...)是正确的

void func(float a, ..., int b)不有效

+0

是的,但这不仅仅是一个回答的评论。当然,你已经解释了一个方面,但这是答案的一个非常小的方面。 – 2017-07-21 13:33:51

0

“您应该考虑使用可变参数函数(C风格)是一个危险的缺陷,“Stephane Rolland说。你可以找到他有用的帖子here

+1

我相信这些建议是用C++编写自己的自定义可变参数函数,而不是用标准库提供的。只是,想象没有'printf'的生活! – 2011-11-27 04:50:01