Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐