[C con Clase] Funciones con numero variable de argumento

Steven Davidson steven en conclase.net
Lun Jul 9 15:35:43 CEST 2007


Hola Oriol,

El pasado 2007-07-09 11:28:56, Gareth escribió:

G> Hola a todos, soy nuevo aqui y estoy aprendiendo desde cero con el C++, 
G> disculpen si mis preguntas son muy obias.

Ante todo, bienvenido a la lista y al mundo de la programación con C++. No importa si las preguntas son sencillas o difíciles, ya que esta clasificación es bastante subjetiva. Por eso tenemos esta lista de correo-e; para aprender C++ y exponer ideas.

G> En el curso que hay colgado en la pagina de c con clase hay un ejemplo que 
G> es:
G> #include <iostream>
G> #include <cstdarg>
G> using namespace std;
G> void funcion(int a, ...);
G> int main() {
G>    funcion(1, "cadena 1", 0);
G>    funcion(1, "cadena 1", "cadena 2", "cadena 3", 0);
G>    funcion(1, 0);
G>    cin.get();
G>    return 0;
G> }
G> void funcion(int a, ...) {
G>    va_list p;
G>    va_start(p, a);
G>    char *arg;
G>    while ((arg = va_arg(p, char*))) {
G>       cout << arg << " ";
G>    }
G>    va_end(p);
G>    cout << endl;
G> }
G> Lo que yo no entiendo es porque el argumento siguiente de la funcion va_arg 
G> es de tipo puntero a char ya que se trata de un array.

Si recuerdas en capítulos anteriores, existe una relación entre arrays y punteros. Podemos manipular un array como si fuera un puntero constante. Por ejemplo,

void func( const char *cad );

int main()
{
  func( "Soy una cadena" );
  ...
}

La cadena literal es pasada como parámetro a 'func()', aunque ésta requiera un puntero. Esto es porque ambos tipos - punteros y arrays - manejan la misma información: direcciones de memoria. Un array ES una dirección de memoria, mientras que un puntero guarda un dirección de memoria.

En cuanto al ejemplo que te preocupa, la macro 'va_arg()' convierte argumentos de la lista 'p' a 'char *'; o sea, se realiza un cásting explícito.


Espero haber aclarado la duda.

Steven


Más información sobre la lista de distribución Cconclase