Linguaxe de programación C (XI). Preconacumulador e biblioteca
1992/01/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
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:
![](images/A55025.jpg)
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:
![](images/A55025-a.jpg)
#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.
![](images/A55025-b.jpg)
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.
![](images/A55025-c.jpg)
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:
![](images/A55025-d.jpg)
![](images/A55025-e.jpg)
![](images/A55025-f.jpg)
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia