Funciones estáticas
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 4 de 61.
Cuando divides el código entre varios archivos, todas las funciones definidas en un archivo de código fuente son visibles para los demás archivos de forma predeterminada. Pero a veces necesitas funciones auxiliares que solo deberían usarse internamente: funciones a las que los demás archivos no deberían acceder 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 called desde otros archivos de origen, incluso si alguien intenta declarela.
// math_utils.c
#include "math_utils.h"
// Helper 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 únicamente 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 de C de lograr la encapsulación a nivel de archivo. Las funciones static te permiten ocultar los detalles de implementación, manteniendo limpia tu interfaz pública mientras usas cualquier lógica helper que necesites internamente.
Desafío
FácilConstruyamos una calculadora de distancias que utilice una función auxiliar privada para calcular el cuadrado de un número: un detalle que debería permanecer oculto para el resto de tu programa.
Crearás tres archivos:
distance.h: Tu archivo de encabezado que declara una única función públicadistance_squaredque recibe cuatro enteros (x1, y1, x2, y2) que representan dos puntos y devuelve un entero. Incluye protectores de inclusión mediante el símboloDISTANCE_H.distance.c: Tu archivo fuente que contiene la implementación. Crea una función auxiliarstaticllamadasquareque recibe un entero y devuelve su cuadrado. Esta función auxiliar solo debería ser visible dentro dedistance.c. Después, implementadistance_squaredutilizando tu función auxiliar estática para calcular (x2-x1)² + (y2-y1)².main.c: Tu archivo principal que incluye el encabezado y utiliza la función pública. La función auxiliarsquareno debería estar disponible aquí: solo está disponibledistance_squared.
La función distance_squared calcula la distancia euclidiana al cuadrado entre dos puntos. Al mantener estática la función square, ocultas este detalle de implementación para cualquier código fuera de distance.c.
Recibirás cuatro entradas enteras: x1, y1, x2 y y2.
Imprime la distancia al cuadrado con este formato:
Squared distance: {result}Por ejemplo, con los puntos (0, 0) y (3, 4), la salida sería:
Squared distance: 25Prué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
// and print the result in the format: "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 Programación Orientada a Objetos
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írculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online