C Preprocesador y macros

En este tutorial, se le presentarán los preprocesadores de c, y aprenderá a usar #include, #define y la compilación condicional con la ayuda de ejemplos.

El preprocesador de C es un preprocesador de macros (le permite definir macros) que transforma su programa antes de que se compile. Estas transformaciones pueden ser la inclusión de archivos de encabezado, expansiones de macros, etc.

Todas las directivas de preprocesamiento comienzan con un #símbolo. Por ejemplo,

 #define PI 3.14

Algunos de los usos comunes del preprocesador de C son:

Incluyendo archivos de encabezado: #include

El #includepreprocesador se utiliza para incluir archivos de encabezado en programas C. Por ejemplo,

 #include 

Aquí stdio.hhay un archivo de encabezado. La #includedirectiva del preprocesador reemplaza la línea anterior con el contenido del stdio.harchivo de encabezado.

Esa es la razón por la que necesita usar #include antes de poder usar funciones como scanf()y printf().

También puede crear su propio archivo de encabezado que contenga la declaración de función e incluirlo en su programa utilizando esta directiva de preprocesador.

 #include "my_header.h"

Visite esta página para obtener más información sobre el uso de archivos de encabezado.

Macros usando #define

Una macro es un fragmento de código al que se le da un nombre. Puede definir una macro en C utilizando la #definedirectiva de preprocesador.

He aquí un ejemplo.

 #define c 299792458 // speed of light

Aquí, cuando usamos c en nuestro programa, se reemplaza por 299792458.

Ejemplo 1: #define preprocessor

 #include #define PI 3.1415 int main() ( float radius, area; printf("Enter the radius: "); scanf("%f", &radius); // Notice, the use of PI area = PI*radius*radius; printf("Area=%.2f",area); return 0; )

Funciona como macros

También puede definir macros que funcionen de manera similar a una llamada de función. Esto se conoce como macros de función. Por ejemplo,

 #define circleArea(r) (3.1415*(r)*(r))

Cada vez que el programa se encuentra circleArea(argument), es reemplazado por (3.1415*(argument)*(argument)).

Supongamos que pasamos 5 como argumento y luego se expande como se muestra a continuación:

 circleArea(5) expands to (3.1415*5*5)

Ejemplo 2: uso del preprocesador #define

 #include #define PI 3.1415 #define circleArea(r) (PI*r*r) int main() ( float radius, area; printf("Enter the radius: "); scanf("%f", &radius); area = circleArea(radius); printf("Area = %.2f", area); return 0; )

Visite esta página para obtener más información sobre macros y #define preprocessor.

Compilación condicional

En la programación en C, puede indicar al preprocesador si debe incluir un bloque de código o no. Para hacerlo, se pueden utilizar directivas condicionales.

Es similar a una ifdeclaración con una gran diferencia.

La ifdeclaración se prueba durante el tiempo de ejecución para verificar si un bloque de código debe ejecutarse o no, mientras que los condicionales se utilizan para incluir (u omitir) un bloque de código en su programa antes de la ejecución.

Usos de condicional

  • use un código diferente según la máquina, el sistema operativo
  • compilar el mismo archivo fuente en dos programas diferentes
  • para excluir cierto código del programa pero para mantenerlo como referencia para propósitos futuros

¿Cómo usar condicional?

Para utilizar condicional, #ifdef, #if, #defined, #elsey #elseifse utilizan directivas.

Directiva #ifdef

 #ifdef MACRO // conditional codes #endif 

Aquí, los códigos condicionales se incluyen en el programa solo si se define MACRO.

Directiva #if, #elif y #else

 #if expression // conditional codes #endif 

Aquí, expresión es una expresión de tipo entero (pueden ser números enteros, caracteres, expresión aritmética, macros, etc.).

Los códigos condicionales se incluyen en el programa solo si la expresión se evalúa con un valor distinto de cero.

La #elsedirectiva opcional se puede utilizar con #ifdirectiva.

 #if expression conditional codes if expression is non-zero #else conditional if expression is 0 #endif 

También puede agregar condiciones anidadas a su #if… #elseuso#elif

 #if expression // conditional codes if expression is non-zero #elif expression1 // conditional codes if expression is non-zero #elif expression2 // conditional codes if expression is non-zero #else // conditional if all expressions are 0 #endif 

#definido

El operador especial #defined se usa para probar si una determinada macro está definida o no. A menudo se usa con la directiva #if.

 #if defined BUFFER_SIZE && BUFFER_SIZE>= 2048 // codes 

Macros predefinidas

Aquí hay algunas macros predefinidas en la programación de C.

Macro Valor
__DATE__ Una cadena que contiene la fecha actual
__FILE__ Una cadena que contiene el nombre del archivo.
__LINE__ Un entero que representa el número de línea actual
__STDC__ Si sigue el estándar C de ANSI, entonces el valor es un número entero distinto de cero
__TIME__ Una cadena que contiene la fecha actual.

Ejemplo 3: obtener la hora actual con __TIME__

El siguiente programa genera la hora actual mediante __TIME__macro.

 #include int main() ( printf("Current time: %s",__TIME__); )

Salida

 Hora actual: 19:54:39

Lecturas recomendadas

  • Control de línea
  • Pragmas
  • Salida del preprocesador
  • Otras directivas

Articulos interesantes...