Menu
Coddy logo textTech

Funciones estáticas

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 4 de 61.

Cuando divides el código en varios archivos, cada función definida en un archivo fuente es visible para otros archivos por defecto. Pero a veces necesitas funciones auxiliares que solo deberían usarse internamente: funciones a las que otros archivos no deberían acceder o ni siquiera conocer.

La palabra clave static, cuando se aplica a una función, restringe su visibilidad al archivo donde está definida. Esto crea una función privada que no puede ser llamada desde otros archivos fuente, incluso si alguien intenta declararla.

// math_utils.c
#include "math_utils.h"

// Ayudante privado - solo visible en este archivo
static int square(int x) {
    return x * x;
}

// Función pública - se puede llamar desde main.c
int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

En este ejemplo, sum_of_squares se declara en el encabezado y se puede usar en cualquier lugar. Sin embargo, square está marcado como static, por lo que existe solo dentro de math_utils.c. Si main.c intenta llamar a square() directamente, el enlazador producirá un error: la función simplemente no existe fuera de su archivo.

Esta es la forma que tiene C de lograr el encapsulamiento a nivel de archivo. Las funciones estáticas permiten ocultar los detalles de implementación, manteniendo limpia la interfaz pública mientras se utiliza cualquier lógica auxiliar necesaria internamente.

challenge icon

Desafío

Fácil

Vamos a construir un calculador de distancia que utiliza una función auxiliar privada para calcular el cuadrado de un número, un detalle que debe permanecer oculto para el resto de su programa.

Crearás tres archivos:

  • distance.h: Tu archivo de cabecera que declara una única función pública distance_squared que toma cuatro enteros (x1, y1, x2, y2) que representan dos puntos y devuelve un entero. Incluye guardas de inclusión utilizando el símbolo DISTANCE_H.
  • distance.c: Tu archivo de origen que contiene la implementación. Crea una función auxiliar static llamada square que toma un entero y devuelve su cuadrado. Este auxiliar solo debe ser visible dentro de distance.c. Luego, implementa distance_squared utilizando tu auxiliar estático para calcular (x2-x1)² + (y2-y1)².
  • main.c: Tu archivo principal que incluye la cabecera y utiliza la función pública. El auxiliar square no debe ser accesible aquí; solo distance_squared está disponible.

La función distance_squared calcula el cuadrado de la distancia euclidiana entre dos puntos. Al mantener la función square como estática, estás ocultando este detalle de implementación de cualquier código fuera de distance.c.

Recibirás cuatro entradas enteras: x1, y1, x2, y y2.

Imprime la distancia al cuadrado en este formato:

Squared distance: {result}

Por ejemplo, con los puntos (0, 0) y (3, 4), la salida sería:

Squared distance: 25

Hoja de referencia

La palabra clave static restringe la visibilidad de una función al archivo donde está definida, creando una función privada que no puede ser llamada desde otros archivos fuente.

// Ayudante privado - solo visible en este archivo
static int square(int x) {
    return x * x;
}

// Función pública - puede ser llamada desde otros archivos
int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

Las funciones estáticas proporcionan encapsulación a nivel de archivo, permitiéndote ocultar detalles de implementación mientras mantienes limpia tu interfaz pública.

Pruébalo tú mismo

#include <stdio.h>
#include "distance.h"

int main() {
    int x1, y1, x2, y2;
    scanf("%d", &x1);
    scanf("%d", &y1);
    scanf("%d", &x2);
    scanf("%d", &y2);
    
    // TODO: Llama a distance_squared con las coordenadas de entrada
    // y muestra el resultado en el formato: "Squared distance: {result}"
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming