0Pricing
C Academy · Lección

Compilación condicional

ifdef y macros

Compilación condicional es una lección gratuita de C Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

El preprocesador

Antes de que el compilador llegue a ver el código, se ejecuta el preprocesador. Este procesa todas las líneas que comienzan por #: inclusiones, macros y condicionales.

La compilación condicional permite incluir o excluir bloques de código según condiciones evaluadas en esta etapa, lo que hace posible generar distintas compilaciones a partir de un mismo código fuente.

Definir macros

#define crea una macro. Sin un valor, es simplemente una marca que puede comprobar más adelante.

Las macros similares a objetos sustituyen un nombre por texto; las marcas simplemente indican que algo está definido.

#define MAX_USERS 100   /* value macro */
#define DEBUG          /* flag macro */

ifdef e ifndef

#ifdef NAME conserva el bloque solo si NAME está definido. #ifndef lo conserva solo si NAME no está definido.

Aquí, la impresión de depuración existe únicamente en las compilaciones de depuración. Si no se define DEBUG, el compilador ni siquiera llega a ver esa línea.

#include <stdio.h>
#define DEBUG

int main(void) {
#ifdef DEBUG
    printf("debug: starting\n");
#endif
    printf("running\n");
    return 0;
}

if, elif y else

#if evalúa una expresión entera constante. Combínelo con #elif y #else para realizar una selección entre varias opciones.

Esto selecciona el código según una macro que contiene un número de versión.

#include <stdio.h>
#define VERSION 2

int main(void) {
#if VERSION >= 2
    printf("new feature on\n");
#else
    printf("legacy mode\n");
#endif
    return 0;
}

El operador defined

Dentro de #if puede comprobar si algo está definido mediante defined(NAME) y combinar comprobaciones con && y ||.

Esto es más flexible que #ifdef, que solo puede comprobar un nombre.

#if defined(LINUX) && !defined(EMBEDDED)
    /* desktop Linux code */
#endif

Definir en tiempo de compilación

No tiene que incluir las macros directamente en el código. La opción -D las define en la línea de comandos.

Así es como los sistemas de compilación activan o desactivan funciones sin editar el código fuente. -DDEBUG equivale a escribir #define DEBUG al principio de cada archivo.

gcc -DDEBUG -DVERSION=3 -o app app.c

Detección de la plataforma

Los compiladores predefinen macros que describen el destino. Puede utilizarlas para escribir código portable.

  • _WIN32 — Windows (32 o 64 bits)
  • __linux__ — Linux
  • __APPLE__ — macOS / iOS

Use estas macros para llamar a la API adecuada de cada plataforma.

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

Protectores de inclusión de archivos de cabecera

El uso clásico de los condicionales es el protector de inclusión, que impide que un archivo de cabecera se procese dos veces.

La primera inclusión define la macro protectora; las siguientes omiten el cuerpo porque la macro ya está definida.

#ifndef UTILS_H
#define UTILS_H

int add(int a, int b);

#endif /* UTILS_H */

Comentar código temporalmente

#if 0 ... #endif desactiva de forma fiable un bloque, incluso si ya contiene comentarios.

A diferencia de /* */, se puede anidar de forma segura, por lo que es la forma estándar de excluir temporalmente código durante la depuración.

#if 0
    legacy_function();   /* disabled for now */
    /* with internal comments too */
#endif

Inspeccionar la salida del preprocesador

Para ver exactamente qué compilará el compilador, ejecute solo el preprocesador con -E.

Esto expande todas las inclusiones, macros y condiciones, lo que resulta muy útil cuando una macro no se comporta como se espera.

gcc -E app.c | less

Conmutadores de funcionalidades en la práctica

Un patrón habitual consiste en usar un único archivo de cabecera de configuración que activa o desactiva funcionalidades para todo el proyecto.

Cambie un solo #define y todos los bloques protegidos de los distintos archivos responderán. Así, las funcionalidades opcionales quedan claramente separadas del código principal.

#include <stdio.h>
#define FEATURE_LOGGING 1

int main(void) {
#if FEATURE_LOGGING
    printf("logging enabled\n");
#endif
    printf("app ready\n");
    return 0;
}

Comprobación rápida

Prediga el comportamiento de una definición en la línea de comandos.

Resumen

Ahora controla la compilación condicional:

  • #ifdef/#ifndef comprueban si una macro está definida
  • #if/#elif/#else evalúan expresiones constantes, junto con defined()
  • -DNAME define macros desde la línea de comandos para cambiar funcionalidades
  • Las macros predefinidas de plataforma permiten escribir código portable; los protectores de inclusión evitan inclusiones duplicadas

Siguiente: organizar el código en varios archivos.

Preguntas frecuentes

¿La lección «Compilación condicional» es gratis?

Sí — el texto completo de «Compilación condicional» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Compilación condicional»?

ifdef y macros Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Compilación condicional»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Compilación condicional
  2. Proyectos con varios archivos
  3. Makefiles
  4. Bibliotecas estáticas y compartidas
← Volver a C Academy