2010-03-12 76 views

回答

17

这样的功能被称为variadic function。您可以使用...用C申报一个,像这样:

int f(int, ...); 

然后你可以使用va_startva_arg,并且va_end有参数列表工作。这里有一个例子:

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

void f(void); 

main(){ 
     f(); 
} 

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)); 
} 

欲了解更多信息,请参阅The C Bookstdarg.h

+2

你举的例子是错误的,不工作,因为它违背的C语法。也许你犯了一个错字,忘了下划线? – psihodelia 2010-03-12 18:21:37

+0

另外,提到'#include '会很好。 – 2010-03-12 18:43:09

+0

已修复,感谢您的反馈。 – 2010-03-12 18:48:16

8

此功能被称为函数中的变量数量为。您必须包含stdarg.h头文件;然后用的va_list类型和的va_start在va_arg,并va_end用来功能的函数体中:

void print_arguments(int number_of_arguments, ...) 
{ 
    va_list list; 
    va_start(list, number_of_arguments); 
    printf("I am first element of the list: %d \n", va_arg(list, int)); 
    printf("I am second element of the list: %d \n", va_arg(list, int)); 
    printf("I am third element of the list: %d \n", va_arg(list, int)); 
    va_end(list); 
} 

然后调用你的函数是这样的:

print_arguments(3,1,2,3); 

这将打印出以下内容:

I am first element of the list: 1 
    I am second element of the list: 2 
    I am third element of the list: 3 
+2

你是不是指'print_arguments(3,1,2,3)'? – bk1e 2010-03-12 15:30:12

+0

@ bk1e:谢谢,我犯了一个错误;已更新 – psihodelia 2010-03-12 18:18:51

7

和其他人一样,printf使用va_args来运行。编写自己的printf版本是非常酷的练习,如果没有别的办法来验证printf,不像Pascal的写法不是编译器魔术。你这样做后,你应该走开。这里有一个blog article我写了详细说明为什么(简单的答案是你可以创建可能长时间未被发现的错误)。

4

,只是完成了故事的gcc(不知道其他的编译器)支持

#define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__) 

,让复杂的宏