2010-10-01 18 views
9

¿Podemos pasar una cantidad variable de argumentos a una función en c?variable pasante número de argumentos

+3

Dicha función se denomina [función variadica] (http://www.gnu.org/s/libc/manual/html_node/Variadic-Functions.html) (para aquellos que buscan buenas palabras clave de búsqueda). – Seth

+0

Gracias. Me ayudó – Shweta

+0

¿Alguna vez ha usado 'printf'? – dan04

Respuesta

11

Here es un ejemplo:

#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 por ejemplo ... Me gustan los ejemplos ... – Matthieu

+1

¿No obtengo el uso del 'registro' aquí? – haroldcampbell

+0

El uso de 'register' es evidencia de que la muestra del código es bastante antigua. El uso de 'register' es una sugerencia para el compilador para colocar la variable en un registro de máquina, como una optimización del rendimiento. La mayoría de los compiladores de C en los últimos 30 años han ignorado esa pista, ya que pueden hacer un mejor trabajo de asignación de registros que la mayoría de los programadores. Hoy en día, 'register' tiene pocos efectos además de prohibir el cálculo de la dirección de una variable. – Peter

0

Sí, si la función acepta argumentos variables. Si necesita hacer su propia función de argumento variable, hay macros que comienzan con va_ que le dan acceso a los argumentos.

+0

No es precisamente incorrecto, pero no es muy útil. –

0

asegúrese de que la lista de argumentos variable debe estar siempre al final de la lista de argumentos

ejemplo: void func(float a, int b, ...) es correcta

pero void func(float a, ..., int b) no es válido

+0

Sí, pero esto es más un comentario que una respuesta. Ciertamente, has explicado un aspecto, pero es un aspecto muy secundario de la respuesta. –

0

"Debería considerar que usando funciones variadas (estilo C) es una falla peligrosa ", dice Stephane Rolland. Puede encontrar su útil publicación here.

+1

Creo que el consejo es escribir sus propias funciones variadic personalizadas en C++ y no para las proporcionadas por la biblioteca estándar. Solo, imagina la vida sin 'printf'! –

Cuestiones relacionadas