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.

Jarrai iezaguzu

Zu idazle

Zientzia aldizkaria

azken alea
Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila
MAIER Koop. Elk.
KIDE Koop. Elk.
ULMA Koop. Elk.
EIKA Koop. Elk.
LAGUN ARO Koop. Elk.
FAGOR ELECTRÓNICA Koop. Elk.