Guardas de inclusión
Evite la inclusión duplicada
Guardas de inclusión es una lección gratuita de C Academy en CoddyKit. Esta es la lección 2 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 problema de la inclusión doble
Las cabeceras suelen incluir otras cabeceras. Es fácil que una cabecera termine incluyéndose dos veces en el mismo archivo de código fuente.
Cuando ocurre, todas sus declaraciones aparecen dos veces. En el caso de definiciones de tipos como struct o typedef, esto provoca un error de compilación: un tipo no puede definirse más de una vez.
Cómo ocurre sin darse cuenta
Suponga que a.h y b.h incluyen ambas types.h. Un archivo de código fuente que incluya las dos acabará teniendo types.h pegado dos veces.
El preprocesador copia a ciegas el texto de las cabeceras, por lo que las definiciones de types.h se duplican y provocan un error de redefinición.
/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h" /* types.h now seen twice */La protección de inclusión
Una protección de inclusión es un pequeño recurso del preprocesador que permite incluir una cabecera muchas veces de forma segura.
Envuelve toda la cabecera en una condición para que el cuerpo se procese solo la primera vez. Las inclusiones posteriores se omiten por completo.
#ifndef TYPES_H
#define TYPES_H
/* header contents here */
#endif /* TYPES_H */Cómo funciona la protección
La primera vez que se encuentra la cabecera, TYPES_H no está definido, por lo que #ifndef es verdadero y el cuerpo se procesa. A continuación, #define establece la macro.
En cualquier inclusión posterior, TYPES_H ya existe, por lo que #ifndef es falso y el preprocesador salta hasta #endif.
#ifndef TYPES_H /* true only the first time */
#define TYPES_H /* remember we've been here */
/* ... body ... */
#endifUna cabecera completa con protección
Aquí tiene una cabecera realista con una protección que protege una definición de tipo.
Aunque muchos archivos incluyan point.h directa o indirectamente, la estructura Point se define exactamente una vez por unidad de traducción.
/* point.h */
#ifndef POINT_H
#define POINT_H
typedef struct {
int x;
int y;
} Point;
Point point_add(Point a, Point b);
#endifElección del nombre de la macro
La macro de protección debe ser única en todo el proyecto; de lo contrario, dos cabeceras podrían entrar en conflicto y ocultarse entre sí silenciosamente.
Una convención habitual deriva el nombre del nombre del archivo en mayúsculas: point.h se convierte en POINT_H y net/socket.h en NET_SOCKET_H.
#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endifEvite los nombres reservados
Los identificadores que comienzan con un guion bajo seguido de una letra mayúscula, o que contienen dos guiones bajos seguidos, están reservados para el compilador y la biblioteca estándar.
Evite protecciones como __POINT_H__. Una forma sencilla con el guion bajo al final, como POINT_H, es segura y clara.
#ifndef _POINT_H_ /* risky: reserved name pattern */
#ifndef POINT_H /* preferred */La alternativa #pragma once
La mayoría de los compiladores modernos admiten #pragma once, una única línea al principio de una cabecera que realiza la misma función.
Es más breve y evita conflictos de nombres, pero no forma parte del estándar de C. Las protecciones tradicionales con #ifndef funcionan en todas partes.
/* point.h */
#pragma once
typedef struct { int x; int y; } Point;Protecciones frente a pragma
Las protecciones con #ifndef son totalmente portables y estándar, pero requieren una macro única para cada cabecera.
#pragma once es compacto y no genera conflictos, pero depende de que el compilador lo admita. Algunos proyectos usan ambos: un pragma y una protección clásica para obtener la máxima seguridad.
#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endifLas protecciones son por unidad de traducción
Una protección de inclusión evita la inclusión duplicada dentro de un mismo archivo de código fuente mientras se compila.
No evita que una cabecera se procese una vez en cada archivo .c independiente. Esto es correcto, porque cada archivo de código fuente es una unidad de traducción distinta.
Conviértalo en un hábito
Añada una protección de inclusión a cada cabecera que escriba, desde la primera línea. Solo requiere tres líneas y evita toda una clase de errores confusos.
Incluso las cabeceras sencillas pueden incluirse indirectamente a través de otras, por lo que protegerlas desde el principio evita problemas.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endifComprobación rápida
Compruebe cuánto domina las protecciones de inclusión.
Resumen
Ha aprendido por qué incluir una cabecera dos veces provoca errores de redefinición y cómo evitarlo mediante una protección de inclusión.
Use #ifndef/#define/#endif con una macro única, o #pragma once. A continuación veremos cómo compartir variables entre archivos con extern.
Preguntas frecuentes
¿La lección «Guardas de inclusión» es gratis?
Sí — el texto completo de «Guardas de inclusión» 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 «Guardas de inclusión»?
Evite la inclusión duplicada 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 2 de 4.
¿Cuánto tiempo toma la lección «Guardas de inclusión»?
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
- Archivos de cabecera y de código fuente
- Guardas de inclusión
- extern y linkage
- Compilar varios archivos