Cuando definimos una función como estática en C, lo que realmente estamos haciendo es limitar a que solo las funciones que están definidas en el mismo archivo que la función estática puedan llamarla a ésta. Para verlo más claro, veamos los siguientes archivos:
//////////////////////////
// Archivo: funciones.h //
//////////////////////////
int sumar (int a, int b);
static int rest(int a, int b);
int restar(int a, int b);
//////////////////////////
// Archivo: funciones.c //
//////////////////////////
#include "funciones.h"
int sumar(int a, int b)
{
return a+b;
}
static int rest (int a, int b)
{
return a-b;
}
int restar (int a, int b)
{
return rest(a,b);
}
/////////////////////
// Archivo: main.c //
/////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c, d, e;
a = 5;
b = 7;
c = sumar(a,b);
d = restar(a,b); //CORECTO! :)
e = rest(a,b); // ERROR! :(
return 0;
}
La función rest() está definida como estática, esto quiere decir que solo las funciones sumar() y restar() pueden llamarla; pero main() -que está definida en otro archivo- no puede hacerlo, ya que no la "vé" directamente. (En esta página hay una forma interesante de saltear esta restricción para casos particulares, como por ejemplo, pruebas unitarias).
Puedo decir, sin intención de herir la susceptibilidad de los paradigmáticos, que las funciones estáticas de C vienen a ser las abuelas de los actuales modificadores private tan utilizados en la programación orientada a objetos, ya que ambos permiten el encapsulamiento de funcionalidad .
Luego sigo ahondando un poco más en el tema, ¡nos vemos!
EDIT: Artículo corregido.
> solo las funciones que están definidas en el mismo archivo que la función estática puedan llamarla a ésta.
ResponderEliminarMás precisamente: en la misma unidad de compilación.
Para todos los efectos, #include es equivalente a copiar el contenido de archivo en lugar de la linea del include.
Tu código, como lo mostrás, compila sin problemas, a diferencia de lo que afirmás.
Lo que deberías haber hecho es llamar "funciones.c" a lo que llamaste .h, y compilar a ambos conjuntamente (ej.: "gcc funciones.c main.c -o main").
En "funciones.h" podés poner los prototipos de la función (es decir:
funciones.h:
int sumar(int, int);
static int rest(int, int);
int restar(int, int);
--
e incluirlo en ambos .c; así tira un error de compilación, diciendo "la función fue usada, pero nunca definida".
Tordek! Tenes razón, no me había dado cuenta!
ResponderEliminarLo hice por inercia al ejemplo.
Gracias por la correción, ahora lo arreglo.
Saludos!!