domingo, 4 de enero de 2009

Creación de Módulos en C

Estas entradas van dirigidas a personas que ya tienen una noción básica de las cosas tales como los módulos, creación del main, tipos de funciones, etc. Por lo que me voy a centrar solo en algunas cosas que creo, son importantes.

Los módulos en C son prácticamente iguales que los demás lenguajes, aquí no tenemos funciones public o private pero si podemos tener un manejo de eso al nivel de los .h

Entonces, la estructura de un .h es del tipo

//Estas lineas nos indican que si en el momento de la compilación no fué definido (incluído) este módulo, entónces que lo incluya.
#ifndef NOMBRE_MODULO
#define NOMBRE_MODULO

// Declaro la función, lo que devuelve y lo que recibe
void escribir(Estructura* miEstructura, char const* ruta);

Estructura* leer(char const* ruta);

//Finaliza la definición
#endif


En el código fuente de mi modulo puedo tener más funciones que las que hay en el .h, pero nunca pueden faltar las que estan declaradas en el .h de lo contrario no compilará.

Se puede tomar al .h como un módulo de definición donde solo aparecen las cabezeras públicas.

El código fuente de ese modulo debrá tener la siguiente esreuctura:

//Incluímos el módulo de definición
#include "nombre_modulo.h"

//Escribimos las implementaciones de las funciones
void escribir(Estructura* miEstructura, char const* ruta){
/*Implementacion
...
*/
}

Estructura* leer(char const* ruta){
/*Implementacion
...
*/
}

//Esta funcion es de uso privado por lo cual no podrá ser accedida desde fuera del módulo
void funcionAuxiliar(Estructura* miEstructura){
/*Implementacion
...
*/
}


Con esto ya tenemos para comenzar a crear módulos

Codificanco en C*

Hace un tiempo tuve que rendir una materia llamada Programación 3 la cuál requería codificar en C*.
Ya terminada esta materia quería compartir con el ó los que sean algunas partes de los laboratorios, así puede llegar a servirle de algo a alguno.

El lenguaje utilizado fué el C con algunas facilidades de C++ el entorno fué el cygwin con los siguientes compiladores:

  • Versión de gcc: 3.4.4
  • Versión de g++: 3.4.4
  • Versión de gdb: 6.3.50-2004-12-28-cvs

Primero que nada, lo mas importante es saber compilar un main por lo que el primer "Tip" será dejar un makefile (archivo con instrucciones de compilación para generar el exe).

Como referencia tenemos:
  • .cpp -> código fuente
  • .h -> módulo de definiciones (se escriben los cabezales de las funciones que se podrán acceder desde fuera del módulo creado)
  • .o -> archivo linkeditado, se genera al momento de la compilación, éstos son el/los módulos compilados en lenguaje máquina. Si no sproporcionan estos archivos sin los .cpp igualmente podremos usar las funciones que contengan (declaradas en el .h).
  • makefile -> archivo son extensión que contiene las instrucciones para compilar


#CC es una variable para el makefile, así no escribo repetidas veces lo mismo. g++ es el compilador
CC=g++
#CFLAGS idem.
#-Wall -> todos los warnings, -Wextra -> Warnings extras
CFLAGS=-Wall -Wextra -ansi -pedantic -O1 -ggdb
#all nombre reservado que dice como se llamará el exe y el path del mismo
all: /home/Usuario/files/nombreDelExe

# EXE ARCHIVO, se deben listar todos los archivos .o (object) que se necesitan
/home/Usuario/files/nombreDelExe: /home/Usuario/files/modulo_1.o /home/Usuario/files/modulo_2.o
$(CC) $(CFLAGS) /home/Usuario/files/modulo_1.o /home/Usuario/files/modulo_2.o -o $@
#$(CC) $(CFLAGS) uso las variables para compilar

#generamos un object por cada modulo que tenemos
/home/Usuario/files/modulo_1.o: /home/Usuario/files/modulo_1.cpp /home/Usuario/files/modulo_1.h Makefile
$(CC) $(CFLAGS) -c /home/Usuario/files/modulo_1.cpp -o $@

/home/Usuario/files/modulo_2.o: /home/Usuario/files/modulo_2.cpp /home/Usuario/files/modulo_2.h Makefile
$(CC) $(CFLAGS) -c /home/Usuario/files/modulo_2.cpp -o $@

# Compilamos el Main
/home/Usuario/files/mainModule.o: /home/Usuario/files/mainModule.cpp Makefile
$(CC) $(CFLAGS) -c /home/Usuario/files/mainModule.cpp -o $@