2010-10-01 15 views
9

Czy możemy przekazać zmienną liczbę argumentów do funkcji wc?przekazywanie zmiennej liczby argumentów

+3

Taka funkcja nazywa się [funkcja variadic] (http://www.gnu.org/s/libc/manual/html_node/Variadic-Functions.html) (dla osób szukających dobrych słów kluczowych w wyszukiwaniu). – Seth

+0

Dzięki. Pomogło mi – Shweta

+0

Czy nigdy nie używałeś 'printf'? – dan04

Odpowiedz

11

Here przykład:

#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 na przykład .... Podobają mi się przykłady ... – Matthieu

+1

Nie mam tutaj dostępu do "rejestru"? – haroldcampbell

+0

Użycie 'register' jest dowodem, że próbka kodu jest dość stara. Użycie 'register' jest wskazówką dla kompilatora, aby umieścić zmienną w rejestrze maszyny, jako optymalizację wydajności. Większość kompilatorów języka C w ciągu ostatnich 30 lat zignorowała tę wskazówkę, ponieważ mogą wykonać lepszą alokację rejestru niż większość programistów. W dzisiejszych czasach 'register' ma niewiele efektów innych niż zabraniające obliczania adresu zmiennej. – Peter

0

Tak, jeśli funkcja przyjmuje zmienne argumenty. Jeśli chcesz utworzyć własną funkcję zmiennych-argumentów, istnieją makra, które zaczynają się od va_, które dają ci dostęp do argumentów.

+0

Nie dokładnie źle, ale niezbyt pomocniczo. –

0

upewnić się, że lista zmienna argument powinien być zawsze na końcu listy argumentów

przykład: void func(float a, int b, ...) jest poprawna

ale void func(float a, ..., int b) nie jest ważne

+0

Tak, ale jest to raczej komentarz niż odpowiedź. Z pewnością wyjaśniłeś jeden aspekt, ale jest to bardzo niewielki aspekt odpowiedzi. –

0

"Należy wziąć pod uwagę, że przy użyciu funkcji wielościowych (styl C) jest niebezpieczną wadą ", mówi Stephane Rolland. Możesz znaleźć jego pomocną wiadomość here.

+1

Uważam, że porady są przeznaczone do pisania własnych niestandardowych funkcji variadic w C++, a nie do tych dostarczonych przez standardową bibliotekę. Po prostu wyobraź sobie życie bez 'printf'! –

Powiązane problemy