Tema Directivas de compilación condicional Proyectos en C++ con clases 1 Taller III 2007 Gentile Fabián Directivas de compilación condicionales • Directivas #ifdef e #ifndef: Estas directivas permiten comprobar si un identificador está o no actualmente definido, es decir, si un #define ha sido previamente procesado para el identificador y si sigue definido. Sintaxis: #ifdef identifier #ifndef identifier La línea: #ifdef identificador tiene exactamente el mismo efecto que #if 1 si el identificador está actualmente definido, y el mismo efecto que #if 0 si el identificador no está definido. #ifndef comprueba la no definición de un identificador, así la línea #ifndef identificador tiene el mismo efecto que #if 0 si el identificador está definido, y el mismo efecto que #if 1 si el identificador no está definido. Estas directivas se utilizan para encerrar código que se compilara condicionalmente. 2 Taller III 2007 Gentile Fabián Directivas de compilación condicionales #ifndef NULL #define NULL 0L #endif • De este modo, la línea del #define se ignorará si el símbolo NULL ya está definido • Todas las directivas condicionales deben completarse dentro del mismo fichero. Sólo se compilarán las líneas que estén dentro de las secciones que cumplan la condición de la expresión constante correspondiente. 3 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • Para crear un programa que utiliza varias clases es necesario crear un proyecto. • El mismo incluirá solamente aquellos archivos cuya extensión es .CPP o .OBJ • Cada clase se incluirá en un archivo cuyo nombre será: NombreClase.H • Cada implementación de la clase se incluirá en un archivo NombreClase.CPP • Cada archivo NombreClase.CPP debe incluir dentro NombreClase.h 4 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • Al incluir un archivo.h (cuyo código posee la declaración de una clase), en 2 o más archivos, el compilador generará un error indicando que esa declaración esta duplicada. 5 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • Para solucionar este problema es necesario utilizar directivas de compilación condicional tales como #ifndef, #endif. • Estas directivas encerraran todo el código que posee un archivo.h para que el compilador solo compile ese código una vez. • Este modelo ya es utilizado por los archivos de cabecera iostream.h, conio.h string.h, etc. 6 Taller III 2007 Gentile Fabián • Ejemplo de un proyecto con Clases utilizando directivas de compilación condicionales Archivo con directivas de compilación condicional 7 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • El proyecto consta de 3 archivos.h, 4 archivos.cpp y un archivo.prj. • Se observa que el archivo Base.h posee directivas de compilación condicionales que encierran el código entre #ifndef .. #endif. • Dentro del mismo se incluye la directiva #define BASE • Por lo tanto la primera vez que el compilador compila este archivo no encuentra este define BASE y por lo tanto lo crea. • La segunda vez que intenta compilar Base.h se encuentra con que BASE ya existe entonces no compila el código encerrado entre el #ifndef y #endif por lo tanto no aparece el error que indica codigo duplicado! Este proyecto compila y linkea correctamente. 8 Taller III 2007 Gentile Fabián Proyectos en C++ con clases #ifndef BASE #define BASE class Base{ public: Base( ); … }; #endif Si no se definió el define BASE Definir BASE La declaración de la clase queda encerrada entre #ifndef y #endif Fin del ifndef 9 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • El archivo Base.cpp posee la implementación de la clase por lo tanto es obligatorio incluir el archivo Base.h // archivo Base.cpp #include “Base.h” Base::Base{ … } … 10 Taller III 2007 Gentile Fabián Proyectos en C++ con clases Clase Derivada1 // archivo Deriv1.h Se incluye el archivo #include “Base.h” Base.h por la herencia class Deriv1:public Base{ public: Deriv1( ); … }; 11 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • El archivo Deriv1.cpp posee la implementación de la clase por lo tanto es obligatorio incluir el archivo Deriv1.h // archivo Deriv1.cpp #include “Deriv1.h” Deriv1::Deriv1(){ … } … 12 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • El archivo Main.cpp posee la utilización de las clase Deriv1 y Deriv2 por lo tanto es obligatorio incluir los archivos Deriv1.h y Deriv2.h #include “Deriv1.h” #include “Deriv2.h” void main(){ Deriv1 d; Deriv2 d; … } 13 Taller III 2007 Gentile Fabián Proyectos en C++ con clases • Por ultimo el archivo del proyecto Includ.prj (en turbo c++ o borland c++) Solo incluirá archivos .cpp , .c o .obj únicamente. • Nunca se deben incluir archivos .h ya que daría un error de linker indicando duplicación de código, aún utilizando directivas de compilación condicionales. 14 Taller III 2007 Gentile Fabián