Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: cdrpo en 01 de Septiembre de 2009, 13:28:55
Título: Explicación en directivas #ifndef, #ifdef en CodeWarrior
Publicado por: cdrpo en 01 de Septiembre de 2009, 13:28:55
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 (header *.h) tiene por nombre por ejemplo file.h, se puede usar como norma general que el archivo file.h tenga la siguiente lineas:
/********file.h********/
#ifndef file__h #define file__h
... /* Código del usuario */
#endif
/*****end of file.h*****/
Ahora coloque unos mensajes al anterior código 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 llama 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 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ó antes, 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, por eso coloco esta publicación acá
Título: Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
Publicado por: ema en 01 de Septiembre de 2009, 13:43:14
El error me parece que sucede al utilizar la directiva #else. Dado que lo que realizas con las anteriores directivas es definir una etiqueta para que el header no sea procesado dos veces.
Solo con escribir lo siguiente ya esta.
/********file.h********/
#ifndef file__h #define file__h
... /* Código del usuario */
#endif
/*****end of file.h*****/
P/D: La directiva #warning tambien esta disponible para los pic. Es propia del lenguaje.
Saludos
Título: Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
Publicado por: RICHI777 en 01 de Septiembre de 2009, 13:57:16
Hola, lo acabo de probar con el CodeWarrior y funciona de maravillas, la diferencia es que los incluyo desde un archivo C, bha todos los H siempre los defino de esa manera. Con respecto al #else da lo mismo poner el warning asi o fuera del #endif. Con respecto a asi lo PIC soportan o no, ni los PIC,ni los AVR ni ningun micro lo soporta, el que da el soporte es el compilador por eso es bueno la aclaración porque existen mas de uno ( CCS, MikroC, SDCC, etc )
Saludos !
Título: Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
Publicado por: fabianjsm en 02 de Septiembre de 2009, 05:13:41
Hola, si funcion1 y funcion2 son dos archivos diferentes no hay ningun comportamiento erroneo en lo que mencionas. Si tu codigo fuera x.h por ejemplo:
Código: C
#ifndef x
#define x
#else
#error x ya fue definida
#endif
Para que ocurra el error que esperas deberias incluir x.h dos veces o más en el mismo archivo:
Código: C
/* archivo x.c */
#include "x.h" /* todo bien, la primer inclusion... */
#include "x.h" /* aca ocurrira lo que esperas */
Disculpame si no entendi la pregunta y conteste cualquier cosa :(
Título: Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
Publicado por: al303576RELOADED en 02 de Octubre de 2009, 16:16:50
No lo he probado, pero creo que lo que sucede es que lo incuye las dos veces en los *.h por que son distintos los alcances del modulo que se esta compilando. bueno esa es la optica que me deja ami. pero deja lo pruevo y comento que paso.