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.
Desafío
FácilVamos 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úblicadistance_squaredque toma cuatro enteros (x1, y1, x2, y2) que representan dos puntos y devuelve un entero. Incluye guardas de inclusión utilizando el símboloDISTANCE_H.distance.c: Tu archivo de origen que contiene la implementación. Crea una función auxiliarstaticllamadasquareque toma un entero y devuelve su cuadrado. Este auxiliar solo debe ser visible dentro dedistance.c. Luego, implementadistance_squaredutilizando 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 auxiliarsquareno debe ser accesible aquí; solodistance_squaredestá 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: 25Hoja 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;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo