[C con Clase] La utilidad de los #if.

Steven Davidson steven en conclase.net
Vie Feb 2 21:45:45 CET 2007


Hola Dani,

El pasado 2007-02-01 09:50:04, dani escribió:

d> Hola a todos,
d> mi pregunta es simplemente que utilidad tienen los #if y si alguien me puede dar un ejemplo de esto. Mi duda en el fondo radica en que creo que puedo hacer lo mismo con el if que con el #if aunque con el if me ahorro tener que volver a compilar cada vez que quiero saltarme una parte del programa.

Me temo que uno no tiene nada que ver con el otro. Recuerda que cualquier "palabra" que veas que empiece con # implica una directiva del precompilador. Esto significa que el precompilador y nadie más que el precompilador verá e interpretará tal directiva. En general, podemos decir que las directivas del precompilador sirven para programar al compilador y en cierta medida al programa.

Te pongo un ejemplo, para que veas el uso correcto. Digamos que estamos creando un programa que necesita usar ciertas funcionalidades. Sin embargo, dependiendo del sistema operativo y posiblemente de su versión podamos usar las funciones especiales y propias tal sistema operativo o por defecto usaremos las nuestras. Por ejemplo,

// "func.h"

// ¿MS-Windows?
#ifdef _WIN32_WINNT

// ¿MS-Windows NT 4.0?
#  if _WIN32_WINNT == 0x0400
#    define FuncionEspecial NT_Func32

// ¿MS-Windows 2000?
#  elif _WIN32_WINNT == 0x0500
#    define FuncionEspecial W2K_Func32

// ¿MS-Windows XP?
#  elif _WIN32_WINNT == 0x0501
#    define FuncionEspecial XP_Func32

// MS-Windows anteriores a NT 4 y 2000 => Me, 95, y 98
// Tenemos que implementar nuestra propia versión de la función
#  else
#    define _DEFINIR_FUNCION_ESPECIAL_
void FuncionEspecial( int *, int );
#endif

// ¿Linux? (con GCC)
#ifdef __gnu_linux__

// Versión de GNU 3.2 o menor
#  if __GNUC__ == 2

// Tenemos que implementar nuestra propia versión de la función
#    define _DEFINIR_FUNCION_ESPECIAL_
void FuncionEspecial( int *, int );

#  else
#    define FuncionEspecial GNUC_Func32
#  endif
#endif

Podríamos seguir, pero bueno, esto es solamente un ejemplo. Luego, en el fichero fuente podríamos tener algo parecido a esto:

// "func.cpp"

#include "func.h"

#ifdef _DEFINIR_FUNCION_ESPECIAL_

// A implementar nuestra propia versión de la función especial
void FuncionEspecial( int *p, int n )
{
  // Sentencias
  ...
}

#endif


Como puedes ver, usamos varias directivas para determinar el resultado del código fuente. Si se trata de MS-Windows, entonces tenemos que hacer ciertas preparaciones de acuerdo a la versión de MS-Windows, al igual que si se trata de Linux y la versión de las bibliotecas de GNU.

Existen otros casos, pero en general no solemos usar estas directivas con tanta frecuencia al menos que estemos implementando nuesdtra propia biblioteca Si es así, entonces queremos dejar todo el trabajo preparado para el precompilador según las diferentes plataformas, versiones, y cualesquier otras condiciones y criterios que tengamos.


El vocablo 'if' sirve para comprobar condiciones en el programa. Esto implica que 'if' es traducido, típicamente, a una instrucción en código máquina.

d> PS: Quizás diga tonterías pq no llevo mucho en C (y menos en C++).

No es ninguna tontería. Si tienes dudas, para eso estamos aquí.


Espero haber aclarado la duda.

Steven


Más información sobre la lista de distribución Cconclase