68 - Definición de funciones y variables static


Cuando tenemos proyectos grandes cada uno de los archivos *.c tienen un objetivo definido y lo llevan a cabo implementando funciones.

Las funciones que implementa un archivo *.c son accedidas desde otros archivos.

Cuando queremos implementar funciones que solo puedan ser llamadas desde funciones del mismo archivo debemos anteceder el modificador static previo al nombre de la función.

Una función static se oculta al resto de archivos del proyecto, con esto logramos encapsular funcionalidades dentro de un archivo.

El modificador static aplicada a una variable global definida en el archivo también solo puede ser accedida por las funciones de ese archivo.

Problema 1:

Se tiene la siguiente declaración:

typedef struct {
    int codigo;
    char descripcion[41];
    float precio;
} tproducto; 

Definir un vector de 4 elementos de tipo tproducto.

Implementar una aplicación que muestre un menú de opciones que permita::

  1. Carga del vector.
  2. Impresión del vector.
  3. Finalizar

Mostrar un título y una línea final de asteriscos cuando se carga e imprima el vector.

Crearemos un proyecto en Code::Blocks dando los pasos similares al concepto anterior y lo llamaremos: proyecto002.

Los contenidos de los tres archivos del proyecto son:

Archivo: productos.h

typedef struct {
    int codigo;
    char descripcion[41];
    float precio;
} tproducto;

#define CANT 4

void cargar(tproducto productos[CANT]);
void imprimir(tproducto productos[CANT]);

Archivo: productos.c

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

static void mostrarTitulo(char *tit)
{
    printf("%s\n",tit);
}

static void mostrarAsteriscos()
{
    printf("********************************************\n\n");
}

void cargar(tproducto productos[CANT])
{
    int f;
    mostrarTitulo("Carga de datos de productos");
    for(f=0;f<CANT;f++)
    {
        printf("Ingrese el codigo:");
        scanf("%i",&productos[f].codigo);
        fflush(stdin);
        printf("Ingrese la descripcion:");
        gets(productos[f].descripcion);
        printf("Ingrese el precio:");
        scanf("%f",&productos[f].precio);
    }
    mostrarAsteriscos();
}

void imprimir(tproducto productos[CANT])
{
    int f;
    mostrarTitulo("Listado de productos");
    for(f=0;f<CANT;f++)
    {
        printf("Codigo:%i\n",productos[f].codigo);
        printf("Descripcion:%s\n",productos[f].descripcion);
        printf("Precio:%0.2f\n",productos[f].precio);
    }
    mostrarAsteriscos();
}

En este archivo tenemos los cambios con respecto al problema anterior.
Las funciones mostrarTitulo y mostrarAsteriscos queremos que solo puedan ser llamadas desde otras funciones del mismo archivo productos.c, para esto le agregamos el modificador static:

static void mostrarTitulo(char *tit)
{
    printf("%s\n",tit);
}

static void mostrarAsteriscos()
{
    printf("********************************************\n\n");
}

Deben estar declaradas en forma previa a cuando son llamadas.

Archivo: main.c

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


int main()
{
    tproducto productos[CANT];
    int opcion;
    do {
        printf("1-Carga de productos.\n");
        printf("2-Listado de productos.\n");
        printf("3-Finalizar programa..\n\n");
        printf("Elija su opcion:");
        scanf("%i",&opcion);
        switch (opcion) {
            case 1:cargar(productos);
                   break;
            case 2:imprimir(productos);
                   break;
        }
    } while(opcion!=3);

    return 0;
}

En el archivo main.c no podemos llamar a las funciones mostrarTitulo y mostrarAsteriscos.

Si intentamos llamarlas:

int main()
{
    tproducto productos[CANT];
    int opcion;
    mostrarAsteriscos(); //error
    do {
        printf("1-Carga de productos.\n");

Aparecerá un error sintáctico en pantalla.

Si consultamos el código fuente del sistema operativo Linux en muchos de sus archivos encontraremos definiciones de funciones de tipo static:

definición de función static en el código fuente linux

Retornar