Linguaxe de programación C (XI). Preconacumulador e biblioteca

O obxectivo deste capítulo é explicar como podemos utilizar as axudas que nos ofrecen tanto os compiladores como os ligandos (chamados linkers) cando o programamos en linguaxe C.

O proceso de compilación prodúcese en dúas fases: a primeira (denominada precontificación) mentres se tratan as sentenzas dirixidas ao preconbator ou as falsas ordes, a segunda é o proceso de tradución que levan a cabo todos os compiladores, obtendo o programa de obxectos.

O ligando enlaza un ou varios módulos de obxectos (tink), resolvendo as referencias cruzadas entre eles e obtendo o programa executable. Os módulos que se asocian poden ser de usuario e/ou estándar, sendo as características destes últimos as seguintes: Atópanse na Biblioteca C, ofrecen moitas posibilidades e é un dos apartados principais da capacidade de C.

Paira ilustrar os elementos presentados, imos dividir este capítulo en tres apartados: o preconacumulador, a biblioteca estándar e as bibliotecas de usuario.

Preconacumulador

As principais posibilidades que ofrece o preconacumulador son tres:

  • Definición de constantes parametrizadas e macros mediante orde #define.
  • Inclusión no programa dun ou máis módulos fonte mediante #include sasiord.
  • Implante de fragmentos de compilación condicional mediante #ifdef e #endif falsas

#define falsa orde

Mediante esta falsa orde realízase a definición de constantes e macros tal e como se viu no capítulo sexto. Por tanto, a un nome asígnaselle un valor ou secuencia de ordes, polo que ao atopar o nome, o compilador substitúe e compilar o valor ou secuencia de ordes que lle corresponde. No Programa 1 pódese ver un exemplo:

Programa 1. Exemplo utilizado #define.

O significado da definición dura até o final do módulo se non se utiliza a falsa orde #undef. Esta nova matanza resulta interesante paira dar un novo significado á definición, xa que algúns compiladores esíxeno antes da redefinición.

#incluído falsa orde

Mediante esta orde pódese introducir un programa fonte dentro doutro, ampliando o concepto de biblioteca ao nivel fonte.

A forma de escribir a falsa orde é a seguinte:

#include <fitxategi izena> <nomee
ficheiro> ou #include "nomee ficheiro"

O nome de ficheiro define o nome que ten o ficheiro ao que se quere acceder e recoméndase que sexa do tipo .h, xa que así se diferencian os ficheiros denominados título (header). A diferenza entre < e > ou " reside na localización do ficheiro. Se C é un ficheiro de título estándar, porase entre < e > para que o compilador búsqueo no catálogo que coñece. A presenza de " indica que se trata dun ficheiro de título de usuario que buscará o sistema no catálogo indicado polo autor.

Os ficheiros de título utilízanse conxuntamente coas bibliotecas e a compilación distribuída. Se algunhas funcións se compilan nun módulo distribuído, o ligante encargarase da relación entre módulos, pero dado que os parámetros utilizados no módulo distribuído, os tipos de datos, a definición de variables globais e o tipo de funcións son necesarios noutros módulos, o máis cómodo é incluír nun ficheiro de título as definicións mencionadas. Este ficheiro incluirase nos programas utilizados polas funcións do módulo distribuído mediante unha inclusión. No programa 2 pódese ver un exemplo de:

Programa 2. Como utilizar o #include falsa orde.

#ifdef, #endif falsos mandamentos

Mediante estas falsas ordes é posible realizar una compilación condicionada. Mediante esta opción de compilación una secuencia de ordes incluirase dentro do programa se a definición está vixente ou o compilador non o ten en conta se non o está. Paira controlar a definición, ademais das ordes #define e #undef, pódese utilizar a opción -D do comando de compilación (cc ou msc).

Esta opción condicional resulta interesante cando se está desenvolvendo un programa paira diferentes máquinas e requírese un tratamento específico conxunto da máquina.

Programa 3. Exemplo de compilación condicional.

Por exemplo, se un programa necesita manexar directamente o rexistro da impresora, pódese facer o indicado no programa 3 paira ter en conta direccións de diferentes máquinas.

Biblioteca estándar

Tal e como se explicou no Capítulo 6, as funcións deben ser definidas antes do seu uso, pero hai un conxunto de funcións predefinidas, un conxunto de funcións estándar ou, o que é o mesmo, una función de biblioteca estándar. Estudamos uns como printf e scanf, pero outro non.

Na táboa 1 móstrase una relación das funcións máis importantes, excepto as de entrada/saída que se mostrarán no seguinte capítulo. Xunto ás funcións, especifícase o nome do ficheiro de título correspondente, xa que paira o uso das funcións estándar débese especificar o título correspondente cunha #include.

O programa 4 inclúe un módulo que utiliza memoria dinámica e os programas de compilación e enlace correspondentes ao esquema 1.

Bibliotecas de usuario

Tal e como indica a programación estruturada e a enxeñaría do software, cando os programas son longos, deben dividirse en funcións, formando conxuntos funcionais, compilando e probando cada un deles por separado. Os módulos así creados pódense catalogar nunha biblioteca para que o ligando utilíceos cos programas que se referencian. Paira iso hai que ter en conta as características das variables analizadas no capítulo 9.

Programa 4, Utilización da memoria dinámica.

Nesta ruta é moi conveniente realizar un ficheiro de título por módulo de obxecto ou biblioteca no que se definan as constantes e tipos de datos, así como as funcións. No esquema 2 móstrase o esquema de enlace de compilación correspondente ao programa 2 visto.

Neste segundo esquema o lóxico é un módulo aparte, pero non se catalogou nunha biblioteca. Paira iso utilizarase o programa ar (con UNIX) e cambiarase o comando de enlace. O conxunto de comandos que quedaría sería:

Táboa . Funcións estándar importantes.
Esquema 1. Uso da biblioteca estándar.
Esquema 2. Compilación distribuída.
Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila