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 */
#endifDefinir 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.cDetecció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>
#endifProtectores 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 */
#endifInspeccionar 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 | lessConmutadores 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/#ifndefcomprueban si una macro está definida#if/#elif/#elseevalúan expresiones constantes, junto condefined()-DNAMEdefine 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
- Compilación condicional
- Proyectos con varios archivos
- Makefiles
- Bibliotecas estáticas y compartidas