Lenguaje de programación C (XI). Preconacumulador y biblioteca

El objetivo de este capítulo es explicar cómo podemos utilizar las ayudas que nos ofrecen tanto los compiladores como los ligandos (llamados linkers) cuando lo programamos en lenguaje C.

El proceso de compilación se produce en dos fases: la primera (denominada precontificación) mientras se tratan las sentencias dirigidas al preconbator o las falsas órdenes, la segunda es el proceso de traducción que llevan a cabo todos los compiladores, obteniendo el programa de objetos.

El ligando enlaza uno o varios módulos de objetos (tink), resolviendo las referencias cruzadas entre ellos y obteniendo el programa ejecutable. Los módulos que se asocian pueden ser de usuario y/o estándar, siendo las características de estos últimos las siguientes: Se encuentran en la Biblioteca C, ofrecen muchas posibilidades y es uno de los apartados principales de la capacidad de C.

Para ilustrar los elementos presentados, vamos a dividir este capítulo en tres apartados: el preconacumulador, la biblioteca estándar y las bibliotecas de usuario.

Preconacumulador

Las principales posibilidades que ofrece el preconacumulador son tres:

  • Definición de constantes parametrizadas y macros mediante orden #define.
  • Inclusión en el programa de uno o más módulos fuente mediante #include sasiord.
  • Implante de fragmentos de compilación condicional mediante #ifdef y #endif falsas

#define falsa orden

Mediante esta falsa orden se realiza la definición de constantes y macros tal y como se vio en el capítulo sexto. Por lo tanto, a un nombre se le asigna un valor o secuencia de órdenes, por lo que al encontrar el nombre, el compilador sustituye y compilar el valor o secuencia de órdenes que le corresponde. En el Programa 1 se puede ver un ejemplo:

Programa 1. Ejemplo utilizado #define.

El significado de la definición dura hasta el final del módulo si no se utiliza la falsa orden #undef. Esta nueva matanza resulta interesante para dar un nuevo significado a la definición, ya que algunos compiladores lo exigen antes de la redefinición.

#incluído falsa orden

Mediante esta orden se puede introducir un programa fuente dentro de otro, ampliando el concepto de biblioteca al nivel fuente.

La forma de escribir la falsa orden es la siguiente:

#include <fitxategi izena> <nombre
fichero> o #include "nombre fichero"

El nombre de fichero define el nombre que tiene el fichero al que se quiere acceder y se recomienda que sea del tipo .h, ya que así se diferencian los ficheros denominados título (header). La diferencia entre < y > o " reside en la ubicación del fichero. Si C es un fichero de título estándar, se pondrá entre < y > para que el compilador lo busque en el catálogo que conoce. La presencia de " indica que se trata de un fichero de título de usuario que buscará el sistema en el catálogo indicado por el autor.

Los ficheros de título se utilizan conjuntamente con las bibliotecas y la compilación distribuida. Si algunas funciones se compilan en un módulo distribuido, el ligante se encargará de la relación entre módulos, pero dado que los parámetros utilizados en el módulo distribuido, los tipos de datos, la definición de variables globales y el tipo de funciones son necesarios en otros módulos, lo más cómodo es incluir en un fichero de título las definiciones mencionadas. Este fichero se incluirá en los programas utilizados por las funciones del módulo distribuido mediante una inclusión. En el programa 2 se puede ver un ejemplo de:

Programa 2. Cómo utilizar el #include falsa orden.

#ifdef, #endif falsos mandamientos

Mediante estas falsas órdenes es posible realizar una compilación condicionada. Mediante esta opción de compilación una secuencia de órdenes se incluirá dentro del programa si la definición está vigente o el compilador no lo tiene en cuenta si no lo está. Para controlar la definición, además de las órdenes #define y #undef, se puede utilizar la opción -D del comando de compilación (cc o msc).

Esta opción condicional resulta interesante cuando se está desarrollando un programa para diferentes máquinas y se requiere un tratamiento específico conjunto de la máquina.

Programa 3. Ejemplo de compilación condicional.

Por ejemplo, si un programa necesita manejar directamente el registro de la impresora, se puede hacer lo indicado en el programa 3 para tener en cuenta direcciones de diferentes máquinas.

Biblioteca estándar

Tal y como se explicó en el Capítulo 6, las funciones deben ser definidas antes de su uso, pero hay un conjunto de funciones predefinidas, un conjunto de funciones estándar o, lo que es lo mismo, una función de biblioteca estándar. Hemos estudiado unos como printf y scanf, pero otros no.

En la tabla 1 se muestra una relación de las funciones más importantes, excepto las de entrada/salida que se mostrarán en el siguiente capítulo. Junto a las funciones, se especifica el nombre del fichero de título correspondiente, ya que para el uso de las funciones estándar se debe especificar el título correspondiente con una #include.

El programa 4 incluye un módulo que utiliza memoria dinámica y los programas de compilación y enlace correspondientes al esquema 1.

Bibliotecas de usuario

Tal y como indica la programación estructurada y la ingeniería del software, cuando los programas son largos, deben dividirse en funciones, formando conjuntos funcionales, compilando y probando cada uno de ellos por separado. Los módulos así creados se pueden catalogar en una biblioteca para que el ligando los utilice con los programas que se referencian. Para ello hay que tener en cuenta las características de las variables analizadas en el capítulo 9.

Programa 4, Utilización de la memoria dinámica.

En esta ruta es muy conveniente realizar un fichero de título por módulo de objeto o biblioteca en el que se definan las constantes y tipos de datos, así como las funciones. En el esquema 2 se muestra el esquema de enlace de compilación correspondiente al programa 2 visto.

En este segundo esquema el lógico es un módulo aparte, pero no se ha catalogado en una biblioteca. Para ello se utilizará el programa ar (con UNIX) y se cambiará el comando de enlace. El conjunto de comandos que quedaría sería:

Tabla . Funciones estándar importantes.
Esquema 1. Uso de la biblioteca estándar.
Esquema 2. Compilación distribuida.
Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila