Buscar en este blog....

martes, 7 de diciembre de 2010

Funciones estáticas de C

Esta tarde estaba mirando/modificando un código en lenguaje C. Me llamó la atención el uso de un puntero a función que referenciaba a una función estática. Me llamó a la atención porque si bien en el paradigma orientado a objetos los métodos estáticos tienen una importancia relevante, no pude hacer una relación inmediata sobre qué podía significar una función estática en la programación estructurada. Por esto es que me puse a buscar un poco, hasta dí con el significado.

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.

2 comentarios:

  1. > solo las funciones que están definidas en el mismo archivo que la función estática puedan llamarla a ésta.

    Má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".

    ResponderEliminar
  2. Tordek! Tenes razón, no me había dado cuenta!
    Lo hice por inercia al ejemplo.
    Gracias por la correción, ahora lo arreglo.

    Saludos!!

    ResponderEliminar

Comments are subject to moderation, only in order to avoid insults and disguising things.

Los comentarios están sujetos a moderación, solo con el fin de evitar insultos y cosas por el estilo.