2010-03-12 39 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__) 

,讓複雜的宏