14.2: Compilación condicional
- Page ID
- 82165
Supongamos por un momento que deseas crear dos o más versiones de un programa que difieran sólo en formas suaves. Si bien es posible mantener múltiples conjuntos de código fuente para cada uno, esto puede ser un dolor cuando llega el momento de corregir un error o agregar una característica ya que habrá que hacer alteraciones en cada uno de los archivos fuente. Sería mucho más fácil de alguna manera “marcar” partes del código fuente como pertenecientes a diferentes versiones del programa y luego hacer que el compilador o preprocesador haga el trabajo por usted. Esto es exactamente lo que es la compilación condicional. Para ello, explotamos el poder del preprocesador. Ya hemos visto la directiva #define
como una forma de definir constantes o crear macros, pero podemos llevarla más allá. Mira el siguiente fragmento de ejemplo:
#define VERSION_A #ifdef VERSION_A char title[] = "This is version A"; #else char title[] = "This is some other version”; #endif
Las directivas #if/#else/#endif
actúan de manera similar a los comandos if/else
. Tenga en cuenta que los paréntesis no se utilizan para bloquear secciones multilínea (de ahí la necesidad de la directiva #endif
). En el ejemplo anterior, el título de la matriz char
se inicializa a “Esta es la versión A”
. Si comentáramos la línea #define VERSIÓN A
, entonces el título
se inicializaría a "Esta es alguna otra versión
”. En algunos IDEs es posible crear variaciones sobre proyectos. Dentro de cada proyecto se pueden definir ciertos símbolos (como VERSION_A
). De esta manera ni siquiera tendrías que comentar/descomentar el #define
, sino solo seleccionar la variación del proyecto deseada. Tenga en cuenta que es posible anidar directivas #if /else
. Además, no se limita a simplemente alterar las declaraciones globales. Esta técnica se puede utilizar tanto en código como en datos. De hecho, las funciones enteras pueden ser agregadas o excluidas de esta manera. Aquí hay otro uso típico:
void some func( void ) { //...code stuff... #ifdef DEBUG printf("Error in some_func, x=%d\n", x ); #endif //...rest of function... }
Si se define DEBUG
, la llamada printf ()
se incluirá en el ejecutable. Si no se define, es como si la llamada printf ()
nunca existiera.