El preprocesador de C

Cómo utilizar el preprocesador de C

El preprocesador es una herramienta que nos ayuda mucho a la hora de programar con C. Forma parte del Estándar C, al igual que el lenguaje, el compilador y la librería estándar.

Analiza nuestro programa y se asegura de que el compilador obtenga todo lo que necesita antes de continuar con el proceso.

¿Qué hace en la práctica?

Por ejemplo, busca todos los archivos de encabezado que incluye con el#includedirectiva.

También mira cada constante que definiste usando#definey lo sustituye por su valor real.

Eso es solo el comienzo, y mencioné esas 2 operaciones porque son las más comunes. El preprocesador puede hacer mucho más.

Te diste cuenta#includey#definetener un#¿al principio? Eso es común a todas las directivas del preprocesador. Si una línea comienza con#, de eso se encarga el preprocesador.

Condicionales

Una de las cosas que podemos hacer es usar condicionales para cambiar cómo se compilará nuestro programa, dependiendo del valor de una expresión.

Por ejemplo, podemos comprobar si elDEBUGconstante es 0:

#include <stdio.h>

const int DEBUG = 0;

int main(void) { #if DEBUG == 0 printf(“I am NOT debugging\n); #else printf(“I am debugging\n); #endif }

Constantes simbólicas

Podemos definir unconstante simbólica:

#define VALUE 1
#define PI 3.14
#define NAME "Flavio"

Cuando usamos NAME o PI o VALUE en nuestro programa, el preprocesador reemplaza su nombre con el valor, antes de ejecutar el programa.

Las constantes simbólicas son muy útiles porque podemos dar nombres a los valores sin crear variables en el momento de la compilación.

Macros

Con#definetambién podemos definir unmacro. La diferencia entre una macro y una constante simbólica es que una macro puede aceptar un argumento y normalmente contiene código, mientras que una constante simbólica es un valor:

#define POWER(x) ((x) * (x))

Observe los paréntesis alrededor de los argumentos, una buena práctica para evitar problemas cuando se reemplaza la macro en el proceso de precompilación.

Entonces podemos usarlo en nuestro código de esta manera:

printf("%u\n", POWER(4)); //16

La gran diferencia con las funciones es que las macros no especifican el tipo de sus argumentos o valores de retorno, lo que puede resultar útil en algunos casos.

Si está definido

Podemos comprobar si se define una constante simbólica o una macro usando#ifdef:

#include <stdio.h>
#define VALUE 1

int main(void) {
#ifdef VALUE
  printf("Value is defined\n");
#else
  printf("Value is not defined\n");
#endif
}

También tenemos#ifndefpara comprobar lo contrario (macro no definida).

También podemos usar#if definedy#if !definedhacer la misma tarea.

Es común envolver un bloque de código en un bloque como este:

#if 0

#endif

para evitar temporalmente que se ejecute, o para utilizar una constante simbólica DEBUG:

#define DEBUG 0

#if DEBUG
  //code only sent to the compiler
  //if DEBUG is not 0
#endif

Constantes simbólicas predefinidas que puede utilizar

El preprocesador también define una serie de constantes simbólicas que puede utilizar, identificadas por los 2 guiones bajos antes y después del nombre, que incluyen:

  • __LINE__se traduce a la línea actual en el archivo de código fuente
  • __FILE__se traduce al nombre del archivo
  • __DATE__se traduce en la fecha de compilación, en elMmm gg aaaaformato
  • __TIME__se traduce en el tiempo de compilación, en elhh:mm:ssformato

Descarga mi gratisManual de C


Más tutoriales de clang: