2010-03-12 22 views

Respuesta

17

Dicha función se llama variadic function. Es posible declarar una en C usando ..., así:

int f(int, ...); 

A continuación, puede utilizar va_start, va_arg y va_end para trabajar con la lista de argumentos. He aquí un ejemplo:

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

Para obtener más información, por favor ver The C Book y stdarg.h.

+2

Su ejemplo es un error y no funciona porque contradice a la sintaxis C. Tal vez has hecho un error tipográfico y olvidaste el guión bajo? – psihodelia

+0

Además, mencionar '#include ' estaría bien. –

+0

Solucionado, gracias por los comentarios. –

8

Esta función se llama Números de variable de argumentos en una función. Debe incluir stdarg.h archivo de encabezado; a continuación, utilizar va_list tipo y va_start, va_arg, y va_end funciones dentro del cuerpo de su función:

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

luego llame a su función como esta:

print_arguments(3,1,2,3); 

que será imprimir a continuación:

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

¿Querías decir 'print_arguments (3,1,2,3)'? – bk1e

+0

@ bk1e: gracias, he hecho un error tipográfico; ha actualizado – psihodelia

7

Como han dicho otros, printf usa va_args para funcionar. Es un ejercicio genial escribir tu propia versión de printf, si nada más para verificar que printf, a diferencia de writeln de Pascal, no es magia de compilación. Después de hacer eso, debe alejarse de él. Aquí hay un blog article que escribí detallando por qué (la respuesta corta es que puedes crear errores que pueden pasar desapercibidos durante mucho tiempo).

4

y justo para completar la historia gcc (no estoy seguro acerca de otros compiladores) soporta

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

para permitir que las macros variadic

Cuestiones relacionadas