[C con Clase] duda con #defines

Pamela Dellepiane pdellepiane en gmail.com
Jue Jun 21 05:56:06 CEST 2007


Bien, muchas gracias Steven, muy clara tu explicación.
La duda que me surge es que he leído que el uso de macros no permite
la 'revisión de tipos' en el libro de Deitel, eso me sugiere que hay
una mejor forma de hacer lo mismo. La pregunta sería ¿cual es la
ventaja de hacerlo con esas macros complejas? ¿hay forma de hacerlo
más legible o portable aunque se pierda eficiencia?

El 14/06/07, Steven Davidson <steven en conclase.net> escribió:
> Hola Pamela,
>
> El pasado 2007-06-14 23:54:54, Pato escribió:
>
> P> Hola, estoy aprendiendo C++. Alguien me puede explicar para que sirven
> P> los siguientes #define's, como se pueden usar o al menos como se leen?
> P> porque me confunden bastante
>
> Veamos el código.
>
> P> #define Hombre 0
> P> #define Mujer    1
> P> #define Identif1  2
> P> #define Identif2  3
>
> Hasta aquí, se definen constantes que sólo existen en la fase de precompilación o preproceso. Estas constantes son automáticamente sustituidas por sus respectivos valores en el resto el código fuente. Esto significa que el compilador jamás sabrá ni "verá" estas constantes.
>
> P> #define PERSON( x )      ( TBL->GetPerson( x ) )
> P> #define PERSONPOINTERTABLE( x )      ( TBL->GetPersonOnTable( x ) )
>
> Estas dos #definiciones son macros; se comportan casi como funciones en C/C++. Las macros son controladas por el precompilador que serán sustituidas por su definición. Nuevamente el compilador no sabe nada acerca de estas macros.
>
> P> /* de aca no entiendo porque el ** */
> P> #define PrimerIterador (( Persona ** ) PERSONPOINTERTABLE( Identif1 ))
> P> #define UltimoIterador (( Persona ** ) PERSONPOINTERTABLE( Identif2 ))
> P> #define HombrePointer  (( Persona * ) PERSON( Hombre ))
> P> #define MujerPointer  (( Persona * ) PERSON( Mujer ))
>
> Aquí tenemos #definiciones de constantes. Lo que está pasando es que se hace un cásting - un cambio forzoso de tipo - a 'Persona **'. Es decir, un doble puntero a 'Persona'. Para que esto funcione, el doble puntero realmente es la dirección de memoria en un array de punteros a 'Persona'. Si usamos 'PrimerIterador' en el código, por ejemplo,
>
> class Persona
> {
>   void func()
>   {
>     cout << PrimerIterador[0]->mostrar();
>   }
>   ...
> };
>
> El precompilador reescribe el código anterior para dejarlo como el siguiente:
>
> class Persona
> {
>   void func()
>   {
>     cout << (( Persona ** ) ( TBL->GetPersonOnTable( 2 ) ))[0]->mostrar();
>   }
>   ...
> };
>
> Como puedes ver, se sustituye las #definiciones y queda código C/C++ para el compilador.
>
>
> Espero haber aclarado las dudas.
>
> Steven
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>




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