Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cdrpo en 19 de Agosto de 2009, 23:31:32
Título: Explicación en directivas #ifndef, #ifdef
Publicado por: cdrpo 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
/********file.h********/
#ifndef file__h
#define file__h
...
#endif
/*****end of file.h*****/
No entiendo para que se ponen subguiones dobles __ al final :?: si el archivo tiene como nombre file.h
gracias
Título: Re: Explicación en directivas #ifndef, #ifdef
Publicado por: BrunoF 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.
Título: Re: Explicación en directivas #ifndef, #ifdef
Publicado por: cdrpo 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++
/********file.h********/
#ifndef __file_ _h
#define __file_ _h
....
#endif
/*****end of file.h*****/
Título: Re: Explicación en directivas #ifndef, #ifdef
Publicado por: RICHI777 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
#ifndef pirulo_file_h
#define pirulo_file_h
...
#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 !
Título: Re: Explicación en directivas #ifndef, #ifdef
Publicado por: BrunoF 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...:)
Título: Re: Explicación en directivas #ifndef, #ifdef
Publicado por: cdrpo 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++
/********file2.h********/
#define TEMPMAXIMA = 20
...
#ifndef MAX // Si no esta definido MAX
#define TEMPMAXIMA = 20 // Entonces defina TEMPMAXIMA = 20
...
#else
...
#endif
/*****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++
/********file.h********/
#ifndef file__h
#define file__h
#warning "el compilador paso por aquí, por que no esta definido file__h "
... /* Código del usuario */
#else
#warning "ya esta definido file__h "
#endif
/*****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++
/********funcion1.h********/
#include "file.h"
...
/*****end of funcion1.h*****/
Código: C++
/********funcion2.h********/
#include "file.h"
...
/*****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