[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