Referencia rápida

Hoja de trucos de directivas y macros del preprocesador de C (cpp)

Guía de referencia rápida para el preprocesador de C (cpp): inclusión de cabeceras, macros, concatenación de tokens (##), conversión a cadena (#) y compilación condicional.

· Publicado

Referencia rápida de sintaxis para el preprocesador de C (cpp), que puede invocarse de forma independiente o integrado en la cadena de compilación de C/C++.

Preprocesamiento independiente

Ejecutar el preprocesador directamente sin invocar al compilador:

# -P inhibe la generación de marcadores de línea
cpp -P source.c > preprocessed.c

Inclusión de cabeceras

#include <stdio.h>      /* Cabeceras del sistema o biblioteca estándar */
#include "my_header.h"  /* Cabeceras locales del proyecto */

Definición de macros

#define BUFFER_SIZE 1024
#define PI 3.1415926535

/* Eliminar la definición de una macro */
#undef BUFFER_SIZE

Macros tipo función

#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define DEG_TO_RAD(x) ((x) * 0.0174532925)

Conversión a cadena (#)

El operador individual # convierte los parámetros de la macro en literales de cadena:

#define STR(name) #name
#define PRINT_VAR(x) printf("%s = %d\n", #x, x)

char *var_name = STR(my_object);  /* → "my_object" */

Concatenación de tokens (##)

El operador doble ## une dos tokens contiguos en uno solo:

#define COMMAND(NAME) { #NAME, NAME ## _command }

struct command commands[] = {
  COMMAND(quit),   /* → { "quit", quit_command } */
  COMMAND(help)    /* → { "help", help_command } */
};

Compilación condicional

#ifdef DEBUG
  #define LOG(msg) printf("[DEBUG] %s\n", msg)
#elif defined(VERBOSE)
  #define LOG(msg) printf("[INFO] %s\n", msg)
#else
  #define LOG(msg) /* noop */
#endif

/* Protectores de inclusión (Include guards) */
#ifndef MY_HEADER_H
#define MY_HEADER_H

/* declaraciones aquí */

#endif /* MY_HEADER_H */

Diagnósticos y advertencias

#if __STDC_VERSION__ < 201112L
  #warning "C11 features are not fully enabled"
#endif

#if !defined(REQUIRED_CONFIG)
  #error "REQUIRED_CONFIG must be defined before compilation"
#endif

Macros estándar predefinidas

  • __FILE__: Nombre del archivo de código fuente actual como cadena.
  • __LINE__: Número de línea actual como entero.
  • __DATE__: Fecha de compilación como cadena (Mmm dd yyyy).
  • __TIME__: Hora de compilación como cadena (hh:mm:ss).

Temas relacionados