Regla 0x0205h: En archivos .c la inclusión de la cabecera propia debe figurar en primer lugar
Comentarios, documentacion y organizacion de archivos (0x02XX)
0x0205h: En archivos .c la inclusión de la cabecera propia debe figurar en primer lugar¶
Enunciado normativo¶
DEBE incluirse primero la cabecera propia del módulo en el archivo
.ccorrespondiente (modulo.cincluye"modulo.h"antes que cualquier otra cabecera de usuario). NO DEBE postergarse esa inclusión detrás de otras.
La cabecera propia es la primera que se incluye en el archivo.
¿Por qué existe esta regla?¶
El problema¶
Cuando modulo.c incluye modulo.h antes que nada, el compilador procesa la
cabecera en el estado más limpio posible. Si modulo.h usa un tipo o una
macro que no incluye por sí misma, el error aparece inmediatamente y delata
que la cabecera no es autosuficiente. Si en cambio se incluye después de
<stdio.h>, el error puede quedar enmascarado porque otra cabecera ya trajo
la definición que faltaba.
En resumen: incluir la cabecera propia primero es una prueba automática de autosuficiencia del encabezado, un principio de diseño de interfaces.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | Un header no autosuficiente compila por casualidad y falla en otro orden. |
| Enlazado | Declaraciones implícitas escondidas pueden generar símbolos mal tipados. |
| Mantenibilidad | Reordenar los #include rompe la compilación sin cambiar la lógica. |
| Portabilidad | En otro compilador, el orden de los encabezados cambia y aflora el fallo. |
| Legibilidad | No se ve de un vistazo el contrato público del módulo. |
Fundamento en el estándar y en la cátedra¶
El estándar define el #include de forma textual: el contenido se inserta en
el punto de la directiva (§6.10.2), por lo que el orden importa. La cátedra
exige la cabecera propia primero para garantizar que cada .h sea
autosuficiente, complementando 0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera (guardas de inclusión) y
0x5005h: Organizá la estructura de tus archivos .c de forma estándar (estructura de archivo).
Alcance y excepciones¶
Aplica a todo .c que tenga una cabecera homónima. Si el archivo .c no
tiene cabecera propia (por ejemplo, un programa de un solo archivo), la
regla no se activa. Esta regla se combina con el orden general de
0x5005h: Organizá la estructura de tus archivos .c de forma estándar, que agrupa primero el propio módulo y luego las bibliotecas.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Cabecera propia al final¶
#include <stdio.h>
#include "otra_cosa.h"
#include "mi_modulo.h"Por qué falla: mi_modulo.h recibe el contexto ya contaminado por las otras
cabeceras; si le falta una definición, el error no se detecta.
❌ Contraejemplo 2 — Cabecera propia ausente¶
#include <stdio.h>
#include <stdlib.h>
int procesar_modulo(int x);Por qué falla: el .c redefine la interfaz de su módulo sin incluir la
cabecera, de modo que nada verifica que la firma coincida con la declarada en
modulo.h.
✅ Ejemplo conforme 1 — Cabecera propia primero¶
#include "mi_modulo.h"
#include <stdio.h>
#include <stdlib.h>Justificación: la cabecera se procesa antes que el resto y actúa como prueba de autosuficiencia; el grupo de bibliotecas queda separado visualmente.
✅ Ejemplo conforme 2 — Módulo con dependencias internas¶
#include "pila.h"
#include "memoria.h"
#include <stddef.h>
#include <stdlib.h>
struct pila
{
int *datos;
size_t cantidad;
size_t capacidad;
};Justificación: primero el contrato público, después las dependencias internas y del sistema; el orden refleja la jerarquía real del módulo.
⚠️ Casos límite¶
Cabecera precompilada: el orden lógico se mantiene aunque el compilador la resuelva por otro mecanismo.
Archivos
.hque incluyen otros.h: también aplican el criterio de autosuficiencia; la guarda de 0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera es obligatoria.Un solo archivo: un programa autocontenido sin cabecera propia no viola la regla.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
| Revisión manual | — | Primer #include distinto del homónimo del .c. |
gaff | gaff check archivo.c | Regla 0x0205h: cabecera propia no es la primera. |
gcc | gcc -Wall -Wextra -std=c11 -c modulo.c | Un error al compilar modulo.h solo revela el problema. |
Checklist de autocontrol¶
¿El
.cincluye su cabecera homónima?¿Esa inclusión es la primera del archivo?
¿La cabecera compila sola, sin incluir nada antes?
¿El orden general respeta 0x5005h: Organizá la estructura de tus archivos .c de forma estándar?
Reglas relacionadas¶
0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera — guardas de inclusión en todas las cabeceras.
0x5005h: Organizá la estructura de tus archivos .c de forma estándar — estructura estándar y orden de secciones del
.c.0x5007h: Inclusiones redundantes o duplicadas de la misma cabecera #include — evitar inclusiones duplicadas de la misma cabecera.
0x500Bh: Inclusión obligatoria de cabeceras estándar para funciones de la biblioteca C — incluir explícitamente la cabecera de cada función usada.
0x0104h: Los nombres de los archivos deben usar snake_case en minúsculas (sin espacios) — el nombre del archivo coincide exactamente con el
#include.