Ir al contenido



Foto

¿Directivas Personalizadas?


  • Por favor identifícate para responder
3 respuestas en este tema

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 07 abril 2017 - 10:37

Hola a todos y todas ;)

 

Como amenacé hace algunos días, acá ando iniciando con preguntas relacionadas a C++ Builder específicamente jejeje

 

En Delphi yo conocía las directivas de compilación pero me he encontrado con algo que parecen ser ¿"directivas personalizadas"? en C++... algo así:

 

#ifdef _IMPRESION_

 

#ifdef _REDES_

 

#ifdef _GRUPOS_

 

He estado buscando básicamente dos cosas: saber cómo se definen esas directivas y si se pueden llamar así (directivas personalizadas)

 

Agradezco su ayuda (y)

 

Saludox ! :)


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.691 mensajes
  • LocationMadrid - España

Escrito 07 abril 2017 - 11:04

A ver si puedo darte una respuesta global y sencilla:

 

#ifdef #ifndef #endif son directivas de compilación condicional. Van seguidas de un identificador que se define con #define y que de puede des-definir con #undef 

 

Si el identificador existe (está definido) la condición es cierta hasta encontrar un #endif. Si no existe se obvia todo el código hasta encontrar el #endif. En el caso de #ifndef,  es al contrario.

 

Es típico usarlas en los archivos cabecera (.h) o de definición para evitar que el compilador los recopile recursivamente cómo el caso de uses anidados entre dos unit delphi.

 

El identificador puede ser cualquier cosa definida con #define, ya sean reservados como estándar (ejm: _DEBUG) o definidos por usuario. Esos identificadores pueden ser pasados como parámetros al compilador de línea de comandos aunque lo normal es que le dejemos al IDE ese trabajo

 

#define sirve también para definir constantes y macros

 

 

Saludos.


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.691 mensajes
  • LocationMadrid - España

Escrito 07 abril 2017 - 04:47

Ahora que estoy en casa con un PC te puedo pones un típico ejemplo:


cpp
  1. //---------------------------------------------------------------------------
  2.  
  3. #ifndef Unit1H
  4. #define Unit1H
  5. //---------------------------------------------------------------------------
  6. #include <Classes.hpp>
  7. #include <Controls.hpp>
  8. #include <StdCtrls.hpp>
  9. #include <Forms.hpp>
  10. //---------------------------------------------------------------------------
  11. class TForm1 : public TForm
  12. {
  13. __published: // IDE-managed Components
  14. TButton *Button1;
  15. void __fastcall Button1Click(TObject *Sender);
  16. private:
  17. void __fastcall WndProc(TMessage& msg);
  18. public: // User declarations
  19. __fastcall TForm1(TComponent* Owner);
  20. };
  21. //---------------------------------------------------------------------------
  22. extern PACKAGE TForm1 *Form1;
  23. //---------------------------------------------------------------------------
  24. #endif

 
Si te fijas, el código comienza con una directiva de compilación condicional:


cpp
  1. #ifndef Unit1H
  2. #define Unit1H
  3. .......
  4. .......
  5. #endif

Unit1H es el nombre del archivo (Unit1.h)pero podría ser otra cosa, es lo mismo. Si no está definido Unit1H lo define: #define Unit1H y no hace falta nada más, ya está definido, seguidamente compila el resto del código, puesto que la condición era cierta (no estaba definido) hasta el #endif. A partir de ahora, el compilador no volverá a compilar puesto que se ha definido el indicador Unit1H. Solo se compilará en el caso de que queramos recompilar.

Las directivas condicionales no están personalizadas, lo que personalizas es el indicador que usan (definido / no definido: verdadero /  falso)
 
Saludos.


  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 18 abril 2017 - 11:52

De vuelta al tema...

 

Amigo escafandra te agradezco mucho el tiempo que te tomaste para responder. Me han sido de mucha ayuda tus comentarios y la info.

 

Por acá sigo desempolvando todas mis clases de C++ de la escuela y aprendiendo ( y re-aprendiendo ) algunas cosas interesantes.

 

Sigo en la tecleadera :D (y)

 

Saludox ! :)


  • 0