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

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

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Explicación en directivas #ifndef, #ifdef en CodeWarrior
« 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++
  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 llama 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 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á


Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
« Respuesta #1 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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
« Respuesta #2 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 !

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
« Respuesta #3 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
  1. #ifndef x
  2. #define x
  3. #else
  4. #error x ya fue definida
  5. #endif

Para que ocurra el error que esperas deberias incluir x.h dos veces o más en el mismo archivo:

Código: C
  1. /* archivo x.c */
  2. #include "x.h" /* todo bien, la primer inclusion... */
  3. #include "x.h" /* aca ocurrira lo que esperas */

Disculpame si no entendi la pregunta y conteste cualquier cosa :(
@fabianjsm is on twitter

Desconectado al303576RELOADED

  • PIC10
  • *
  • Mensajes: 11
Re: Explicación en directivas #ifndef, #ifdef en CodeWarrior
« Respuesta #4 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.