Autor Tema: Explicación en directivas #ifndef, #ifdef  (Leído 3062 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Explicación en directivas #ifndef, #ifdef
« en: 19 de Agosto de 2009, 23:31:32 »
Hola,

El siguiente texto y ejemplo lo saque del libro de programación de sistemas embebidos en C de alfaomega, pag. 208

Dice:
Por recomendación si un archivo de cabecera tiene por nombre por ejemplo file.h, se puede usar como norma general que el archivo file.h tenga la siguiente estructura:

Código: C
  1. /********file.h********/
  2. #ifndef file__h      
  3.      #define file__h
  4.      ...
  5. #endif
  6. /*****end of file.h*****/

No entiendo para que se ponen subguiones dobles __  al final  :?: si el archivo tiene como nombre file.h

gracias
« Última modificación: 22 de Agosto de 2009, 14:12:01 por cdrpo »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Explicación en directivas #ifndef, #ifdef
« Respuesta #1 en: 20 de Agosto de 2009, 01:04:00 »
Hola. Los guiones bajos "creo"(si mi memoria no falla) son porque no se permite el caracter "." en el nombre(puede que me este equivocando y sea por convención, no por prohibición).

Ahora, la utilidad de esto, es que protejas al archivo de posibles duplicaciones en las definiciones, funciones,etc.

Es decir,agregar esas directivas aseguran que el archivo en cuestión sea analizado sólo 1 vez por más que se lo incluya más de una vez desde distintas partes del proyecto. La primera vez la condición #ifndef se cumplirá, pero ya la segunda no(debido a que en la primera pasada se definió el "file__h" en este caso).
Esto evita que el compilador falle o malinterprete el código a la hora de hacer el "build" de tu proyecto.

Se entendió?

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Re: Explicación en directivas #ifndef, #ifdef
« Respuesta #2 en: 20 de Agosto de 2009, 09:32:50 »
Gracias, entendido la segunda parte.

En otros libros le anteponen al nombre mas de un subguion, un subguion antes de "h" puede significar punto, pero dos :?:
y al comienzo otros dos  :?:

Código: C++
  1. /********file.h********/
  2.  
  3. #ifndef __file_ _h      
  4.     #define __file_ _h
  5.     ....
  6. #endif
  7.  
  8. /*****end of file.h*****/

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Explicación en directivas #ifndef, #ifdef
« Respuesta #3 en: 20 de Agosto de 2009, 10:37:51 »
Hola, el nombre que se define puede ser cualquier cosa, por convención se utiliza el de reemplazar el punto por el slash, pero esto tambien seria válido.

Código: C
  1. #ifndef pirulo_file_h
  2. #define pirulo_file_h
  3. ...
  4. #endif

Las razones te las comento Bruno, de esta manera se restringe inclusiones repetidas y posibles errores con eso, además la compilación resultante es más rápida.

Saludos !

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Explicación en directivas #ifndef, #ifdef
« Respuesta #4 en: 20 de Agosto de 2009, 21:03:53 »
Hola RICHI. Gracias por definir eso, pero..el slash no es el '_' sino el '/'. Digo para que no lo confundamos más, pobre...:)
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Re: Explicación en directivas #ifndef, #ifdef
« Respuesta #5 en: 22 de Agosto de 2009, 14:31:14 »
Entiendo que la directiva #ifndef pregunta si No esta definido ..., si es así el compilador tomara todas las lineas siguientes hasta encontrar #else o #endif

Código: C++
  1. /********file2.h********/
  2. #define TEMPMAXIMA = 20
  3. ...
  4. #ifndef MAX                 // Si no esta definido MAX
  5.      #define TEMPMAXIMA = 20   // Entonces defina TEMPMAXIMA = 20
  6.      ...
  7. #else
  8.     ...
  9. #endif
  10. /*****end of file2.h*****/

--------------------

Regresando al primer ejemplo, coloque unos mensajes para detectar por donde pasa el compilador y comprobar el funcionamiento de la directiva ifndef

Código: C++
  1. /********file.h********/
  2. #ifndef file__h      
  3.     #define file__h
  4.     #warning "el compilador paso por aquí, por que no esta definido file__h "
  5.  
  6.     ... /* Código del usuario */
  7.  
  8. #else
  9.    #warning "ya esta definido file__h "
  10.  
  11. #endif
  12.  
  13. /*****end of file.h*****/

ahora se incluye el anterior archivo file.h desde otros dos archivos de nombre funcion1.h y funcion2.h para comprobar cuantas veces el compilador incluye a file.h y ver si la directiva #ifndef file__h trabaja a no

Código: C++
  1. /********funcion1.h********/
  2. #include "file.h"
  3. ...
  4. /*****end of funcion1.h*****/


Código: C++
  1. /********funcion2.h********/
  2. #include "file.h"
  3. ...
  4. /*****end of funcion2.h*****/

Al compilar veo que no sirve la recomendación que hace el libro de programación en C  de incluir la siguiente linea al inicio de cada un archivo cabecera (header *.h) #ifndef file__h

La primer pasada que hace el compilador arroja correctamente el siguiente mensaje "el compilador paso por aquí, por que no esta definido file__h " OK
pero la segunda ves ya no debería por que ya se definió, es decir debe arrojar #warning "ya esta definido file__h "

Conclucion  el compilador Codewarrior genera dos veces el mismo mensaje "el compilador paso por aquí, por que no esta definido file__h " :?:

Por favor analicen los códigos anteriores y me comentan
Gracias

Nota la directiva #warning no se si esta disponible en PIC-C
« Última modificación: 01 de Septiembre de 2009, 13:32:41 por cdrpo »