El formato de la estructura condicional general es el siguiente:
#if Condición1|#ifdef Macro1|#ifndef Macro2 /* Directivas alternativas para comenzar a establecer una compilación condicional */
Código1
[#elif Condición2]
Código2
[#elif Condición3]
...
[#else]
Código3
#endif
Una de las tareas del preprocesador es la compilación condicional, lo que permite al programador establecer si una parte del programa va a ser compilada, o no, dependiendo de una condición.
Las directivas condicionales son: #if,
#ifdef,
#ifndef,
#elif,
#else y
#endif. La forma en que se
procesar esta estructura es la siguiente: si se cumple el
#if,
#ifdef o
#ifndef se incluye sólo el
Código1, si no, se incluye sólo el código asociado al primer
#elif cuya condición sea
verdadera, si no, se incluye el Código3 asociado al
#else. La directiva
#endif determina el final de
la estructura.
Para más información examine la ayuda sobre directivas del preprocesador.
La función ordena, según esté definida, o no, una macro, se compila para usar un vector auxiliar en memoria dinámica o en la pila:
#ifdef USAHEAP #include <stdlib.h> #endif void ordenaLineal(int vec[], int vecs[], int n){ int i, j, k; vecs[0]=vec[0]; for(i=1;i<n;i++){ for(j=0;(j<i)&&(vecs[j]<=vec[i]);j++); for(k=i-1;k>=j;k--) vecs[k+1]=vecs[k]; vecs[j]=vec[i]; } } void ordena(int vector[], int n){ #ifdef USAHEAP int *aux, i; aux=(int *)malloc(n*sizeof(int)); #else int aux[MAXSIZE], i; #endif ordenaLineal(vector,aux,n); for(i=0;i<n;i++) vector[i]=aux[i]; #ifdef USAHEAP free(aux); #endif }
Por ejemplo, si "USAHEAP" estuviese definido se tendría como resultado del preproceso el siguiente código para la función ordena:
#include <stdlib.h> void ordena(int vector[], int n){ int *aux, i; aux=(int *)malloc(n*sizeof(int)); ordenaLineal(vector,aux,n); for(i=0;i<n;i++) vector[i]=aux[i]; free(aux); }
Si "USAHEAP" no estuviese definido y "MAXSIZE" valiese "100" se tendría este otro código:
void ordena(int vector[], int n){ int aux[100], i; ordenaLineal(vector,aux,n); for(i=0;i<n;i++) vector[i]=aux[i]; }