[C con Clase] duda con #defines
Steven Davidson
steven en conclase.net
Vie Jun 15 02:54:00 CEST 2007
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
Más información sobre la lista de distribución Cconclase