Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x5005h: Organizá la estructura de tus archivos .c de forma estándar

Compilacion, preprocesador y seguridad (0x50XX)

Universidad Nacional de Río Negro

0x5005h: Organizá la estructura de tus archivos .c de forma estándar

Enunciado normativo

DEBE ordenarse cada archivo .c en secciones progresivas: (1) cabeceras estándar, (2) cabeceras de terceros, (3) cabeceras del proyecto, (4) macros y constantes, (5) tipos, (6) prototipos de funciones privadas, (7) main si aplica, (8) funciones públicas y (9) funciones privadas static.

¿Por qué existe esta regla?

El problema

Un archivo de C no impone un orden más allá de que las declaraciones precedan a su uso. Cuando cada archivo elige uno distinto (defines en el medio, prototipos después de main, #include al final), el lector no puede anticipar dónde está cada cosa. El orden canónico vuelve al archivo predecible y los prototipos static agrupados liberan el orden de implementación.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
CompilaciónUso sin prototipo previo: implicit declaration, error con -Werror.
MantenibilidadCada archivo exige una lectura completa para saber qué expone.
Maquetadomain escondido en el medio dificulta localizar el flujo principal.

Fundamento en el estándar y en la cátedra

ISO/IEC 9899:2011 §6.9 regula las definiciones externas y §6.2.1 los ámbitos: una función debe declararse antes de invocarse. La cátedra fija el orden por convención para que docente y corrector encuentren siempre lo mismo.## Alcance y excepciones

Aplica a todos los .c; los .h se rigen por 0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera. Excepción: un ejercicio de una sola función trivial se reduce a includes y main.

Ejemplos exhaustivos

❌ Contraejemplo 1 — Prototipo posterior al uso

int main(void)
{
    return duplicar(21);
}

int duplicar(int x)
{
    return x * 2;
}

Por qué falla: main invoca duplicar sin declaración previa; C11 ya no admite declaraciones implícitas y -Werror detiene la compilación.

❌ Contraejemplo 2 — Definiciones dispersas y cabecera al final

#define ESCALA 2

int calcular(int x)
{
    return x * ESCALA;
}

#include <stdio.h>

Por qué falla: la cabecera se incluye después de su uso, el #define quedó arriba y el archivo no tiene secciones reconocibles.

✅ Ejemplo conforme 1 — Esqueleto canónico

#include <stdio.h>

#include "calculo.h"

#define ESCALA 2

static int normalizar(int x);

int main(void)
{
    return normalizar(21);
}

static int normalizar(int x)
{
    return calculo_duplicar(x) / ESCALA;
}

Las dependencias quedan arriba, main antes del cuerpo y las funciones privadas al final; el orden hace evidente qué expone el módulo.

✅ Ejemplo conforme 2 — Módulo sin main

#include "punto.h"

static int abs_entero(int x);

int punto_distancia(punto_t a, punto_t b)
{
    return abs_entero(a.x - b.x) + abs_entero(a.y - b.y);
}

static int abs_entero(int x)
{
    if (x < 0) {
        return -x;
    }
    return x;
}

En un TAD la sección 7 se omite; la sección 6 permite que punto_distancia use abs_entero sin importar la posición física.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cMarca 0x5005h con #include o #define fuera de su sección.
gcc / clanggcc -std=c11 -Wall -Wextra -Werror -pedantic archivo.cimplicit declaration of function.

Checklist de autocontrol

Reglas relacionadas