2010-10-01 17 views
9

Possiamo passare un numero variabile di argomenti a una funzione in c?passando il numero variabile di argomenti

+3

Tale funzione è chiamata [funzione variadica] (http://www.gnu.org/s/libc/manual/html_node/Variadic-Functions.html) (per coloro che cercano buone parole chiave di ricerca). – Seth

+0

Grazie. Mi ha aiutato – Shweta

+0

Non hai mai usato 'printf'? – dan04

risposta

11

Here è un esempio:

#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 per esempio .... Mi piacciono gli esempi ... – Matthieu

+1

Non riesco ad usare il 'register' qui? – haroldcampbell

+0

L'uso di 'register' è la prova che il codice di esempio è piuttosto vecchio. L'uso di 'register' è un suggerimento per il compilatore per posizionare la variabile in un registro macchina, come ottimizzazione delle prestazioni. La maggior parte dei compilatori C negli ultimi 30 anni ha ignorato tale suggerimento, dal momento che può fare un lavoro migliore di assegnazione dei registri rispetto a quanto può fare la maggior parte dei programmatori. Al giorno d'oggi, 'register' ha pochi effetti diversi dal proibire il calcolo dell'indirizzo di una variabile. – Peter

0

Sì, se la funzione accetta argomenti variabili. Se hai bisogno di creare la tua funzione di argomento variabile, ci sono macro che iniziano con va_ che ti danno accesso agli argomenti.

+0

Non proprio sbagliato, ma non molto utile. –

0

assicurarsi che l'elenco di argomenti variabili dovrebbe essere sempre alla fine della lista degli argomenti

esempio: void func(float a, int b, ...) è corretto

ma void func(float a, ..., int b) non è valido

+0

Sì, ma questo è più un commento che una risposta. Certamente, hai spiegato un aspetto, ma è un aspetto molto minore della risposta. –

0

"È necessario considerare che l'utilizzo di funzioni variadiche (stile C) è un difetto pericoloso ", afferma Stephane Rolland. Puoi trovare il suo utile post here.

+1

Credo che il consiglio sia per scrivere le proprie funzioni variadiche personalizzate in C++ e non per quelle fornite dalla libreria standard. Semplicemente, immagina la vita senza 'printf'! –

Problemi correlati