[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