13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 46 — #84<br />

✐<br />

Capítulo 2. Construir y usar objetos<br />

1. Se incluye el fichero de cabecera de la librería.<br />

2. Se usan las funciones y las variables de la librería.<br />

3. Se <strong>en</strong>laza la librería junto con el programa ejecutable.<br />

Estos pasos también se aplican cuando los módulos objeto no se combinan para<br />

formar una librería. Incluir el fichero cabecera y <strong>en</strong>lazar los módulos objeto es la base<br />

para la compilación separada <strong>en</strong> C y <strong>en</strong> <strong>C++</strong>.<br />

Cómo busca el <strong>en</strong>lazador una librería<br />

Cuando se hace una ref<strong>en</strong>cia externa a una función o una variable <strong>en</strong> C o <strong>C++</strong>,<br />

al <strong>en</strong>lazador, una vez <strong>en</strong>contrada esta refer<strong>en</strong>cia, puede hacer dos cosas. Si todavía<br />

no ha <strong>en</strong>contrado la definición de la función o variable, añade el id<strong>en</strong>tificador a su<br />

lista de «refer<strong>en</strong>cias no resueltas». Si el <strong>en</strong>lazador ya había <strong>en</strong>contrado la definición,<br />

se resuelve la refer<strong>en</strong>cia.<br />

Si el <strong>en</strong>lazador no puede <strong>en</strong>contrar la definición <strong>en</strong> la lista de módulos objeto,<br />

busca <strong>en</strong> las librerías. Las librerías ti<strong>en</strong><strong>en</strong> algún tipo de indexación para que el <strong>en</strong>lazador<br />

no necesite buscar <strong>en</strong> todos los módulos objeto <strong>en</strong> la librería - solam<strong>en</strong>te<br />

mira <strong>en</strong> el índice. Cuando el <strong>en</strong>lazador <strong>en</strong>cu<strong>en</strong>tra una definición <strong>en</strong> una librería, el<br />

módulo objeto <strong>en</strong>tero, no sólo la definición de la función, se <strong>en</strong>laza al programa ejecutable.<br />

Dese cu<strong>en</strong>ta que no se <strong>en</strong>laza la librería completa, tan solo el módulo objeto<br />

de la librería que conti<strong>en</strong>e la definición que se necesita (de otra forma los programas<br />

se volverían innecesariam<strong>en</strong>te largos). Si se desea minimizar el tamaño del programa<br />

ejecutable, se debería considerar poner una única función <strong>en</strong> cada fichero fu<strong>en</strong>te<br />

cuando se construyan librerías propias. Esto requiere más trabajo de edición, 4 pero<br />

puede ser muy útil para el usuario.<br />

Debido a que el <strong>en</strong>lazador busca los ficheros <strong>en</strong> el ord<strong>en</strong> que se le dan, se puede<br />

prev<strong>en</strong>ir el uso de una función de una librería insertando un fichero con su propia<br />

función, usando el mismo nombre de función, <strong>en</strong> la lista antes de que aparezca el<br />

nombre de la librería. Cuando el <strong>en</strong>lazador resuelva cualquier refer<strong>en</strong>cia a esa función<br />

<strong>en</strong>contrando la función antes de buscar <strong>en</strong> la librería, se utilizará su función<br />

<strong>en</strong> lugar de la que se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la librería. Eso también puede ser una fu<strong>en</strong>te de<br />

errores, y es la clase de cosas que se puede evitar usando los espacios de nombres<br />

(namespaces) de <strong>C++</strong>.<br />

Añadidos ocultos<br />

Cuando se crea un programa ejecutable <strong>en</strong> C/<strong>C++</strong>, ciertos elem<strong>en</strong>tos se <strong>en</strong>lazan<br />

<strong>en</strong> secreto. Uno de estos elem<strong>en</strong>tos es el módulo de arranque, que conti<strong>en</strong>e rutinas<br />

de inicialización que deb<strong>en</strong> ejecutarse cada vez que arranca un programa C o <strong>C++</strong>.<br />

Estas rutinas preparan la pila e inicializan ciertas variables del programa.<br />

El <strong>en</strong>lazador siempre busca la librería estándar para las versiones compiladas de<br />

cualquier función «estándar» llamada <strong>en</strong> el programa. Debido a que se busca siempre<br />

<strong>en</strong> la librería estándar, se puede usar cualquier cosa de esta librería simplem<strong>en</strong>te<br />

añadi<strong>en</strong>do a su programa la cabecera apropiada; no necesita indicar dónde hay que<br />

buscar la librería estándar. Las funciones de flujo de <strong>en</strong>trada-salida (iostream), por<br />

ejemplo, están <strong>en</strong> la Librería Estándar de <strong>C++</strong>. Para usarla, sólo debe incluir el fichero<br />

de cabecera .<br />

4 Yo le recom<strong>en</strong>daría usar Perl o Python para automatizar estas tareas como parte de su proceso de<br />

empaquetami<strong>en</strong>to de librerías (ver www.Perl.org ó www.Python.org).<br />

46<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!