¿Qué significan los tres puntos en la lista de parámetros de una función?

3 minutos de lectura

avatar de usuario
ashishsony

Encontré una definición de función como:

char* abc(char *f, ...)
{
}

¿Qué significan los tres puntos?

  • gracias a todos por la rápida respuesta… esta comunidad es simplemente increíble…

    – AshishSony

    1 de marzo de 2009 a las 13:02

  • bueno… esta pregunta muestra que no estoy prestando atención mientras he estado codificando durante el último año profesionalmente, ya que he usado printf, scanf tantas veces… pero nunca me di cuenta de cómo estas funciones pueden aceptar argumentos ilimitados. .Necesito hacerme esas preguntas mucho más a menudo.

    – AshishSony

    1 de marzo de 2009 a las 13:17

avatar de usuario
paxdiablo

Este tipo de funciones se denominan funciones variadicas (enlace de wikipedia). Usan puntos suspensivos (es decir, tres puntos) para indicar que hay un número variable de argumentos que la función puede procesar. Un lugar en el que probablemente haya usado tales funciones (quizás sin darse cuenta) es con los diversos printf funciones, por ejemplo (del estándar ISO):

int printf(const char * restrict format, ...);

Los puntos suspensivos le permiten crear funciones donde la cantidad de parámetros no se conoce de antemano, y puede usar stdargs.h funciones (va_start, va_arg y va_end) para obtener los argumentos específicos.

Tienes que saber el tipos de los argumentos que extrae y tiene alguna forma de decidir cuándo ha terminado. los printf las funciones hacen esto con la cadena de formato (tanto para tipos como para recuento), mientras que mi código de ejemplo a continuación siempre asume const char * como el tipo con un valor centinela NULL para decidir la finalización.

Este enlace aquí tiene un buen tratado sobre el uso de listas de argumentos variables en printf.


Como ejemplo, el siguiente programa contiene una función outStrings()que le permite imprimir un número arbitrario de cadenas:

#include <stdio.h>
#include <stdarg.h>

void outStrings(const char *strFirst, ...) {
    // First argument handled specially.

    printf("%s", strFirst);
    va_list pArg;
    va_start(pArg, strFirst);

    // Just get and process each string until NULL given.

    const char *strNext = va_arg(pArg, const char *);
    while (strNext != NULL) {
        printf("%s", strNext);
        strNext = va_arg(pArg, const char *);
    }

    // Finalise processing.

    va_end(pArg);
}

int main(void) {
    char *name = "paxdiablo";
    outStrings("Hello, ", name, ", I hope you're feeling well today.\n", NULL);
}

Wikipedia en funciones vararg en C++.

Se llaman puntos suspensivos y significan que la función puede tomar un número indeterminado de parámetros. Su función probablemente se puede llamar así:

abc( "foo", 0 );
abc( "foo", "bar", 0 );

Tiene que haber una manera de indicar el final de la lista. Esto se puede hacer utilizando el primer parámetro, como una cadena de formato printf(0, o mediante un terminador especial, cero en el ejemplo anterior.

Las funciones con un número variable de parámetros se consideran de mala forma en C++, ya que no se pueden realizar comprobaciones de tipos ni conversiones definidas por el usuario en los parámetros.

Esto es lo que se llama una función varargs o una función de argumento variable en C.

Uno que probablemente reconocerá es printf.

¿Ha sido útil esta solución?