#if, #ifdef, #ifndef, #elif, #else y #endif

Sintaxis

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

Descripción

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.

Ejemplo

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];
}