2.5.- Enlace


En la creación de un programa ejecutable, primero se lleva a cabo la compilación de diversas unidades de traslación, las cuales se componen del código fuente junto con los archivos incluidos. Posteriormente, el archivo objeto (.obj) , se enlaza con librerías preexistentes para obtener el archivo ejecutable (.exe).

El enlace es el proceso que permite a cada instancia de un identificador asociarse correctamente con un objeto o función particular. Todos los identificadores tienen uno de los siguientes atributos de enlace, íntimamente relacionados con su ámbito:


Estos atributos se determinan a través del emplazamiento y los formatos de las declaraciones, junto con el uso ( implícito ó explícito ) de los especificadores de clase de almacenamiento static ó extern.

Cada instancia de un identificador con enlace externo representa al mismo objeto ó función a través de todo el conjunto de archivos y librerías que componen el programa.

Cada instancia de un identificador con enlace interno representa al mismo objeto ó función solamente dentro de un archivo.

Los identificadores sin enlace representan entidades únicas.

A continuación se presentan las:

REGLAS PARA LOS ENLACES INTERNO Y EXTERNO:

  1. Cualquier identificador de objeto ó archivo que tenga ámbito de archivo tendrá enlace interno si su declaración contiene el especificador static.
    Para C++, si el mismo identificador aparece con ambos tipos de enlace en el mismo archivo, el identificador tendrá enlace externo.

  2. Si la declaración de un identificador de un objeto ó función contiene el especificador extern , el identificador tendrá el enlace correspondiente a una declaración con ámbito de archivo.

  3. Si una función se declara sin un especificador de clase de almacenamiento, su enlace está determinado como si se hubiera utilizado el especificador extern.

  4. Si un identificador de objeto con ámbito de archivo se declara sin especificador de clase de almacenamiento, el identificador tendrá enlace externo.

Los siguientes identificadores no tienen atributo de enlace:

Para aclarar lo relacionado con el especificador extern, revisemos los listados 2.1 y 2.2.

// EXTERN1.CPP                                                 
                                                               
int edad; char nombre[31]; // DEFINICION de variables globales 

Listado 2.1.- EXTERN1.CPP, que define las variables globales.


// EXTERN2.CPP                                                 
 #include <iostream.h>                                           
// DECLARACION de variables globales que:                      
extern int edad;     // se encuentran en otro archivo          
extern char nombre[];                                          
void main()                                                    
{                                                              
   cout << "\nCUAL ES TU NOMBRE ? " ; cin>> nombre ;                                             
   cout << "\nCUANTOS AÑOS TIENES, " << nombre << " ?" ; cin>> edad ; cout << "\n\n" ; cout << " TE FALTAN " << 100-edad ; cout << " PARA LLEGAR A LOS CIEN, " << nombre << "\n" ; } 

Listado 2.1.- EXTERN2.CPP, que declara y utiliza variables globales definidas en otro archivo.

En el archivo EXTERN1.CPP se definen las variables globales edad y nombre. Posteriormente se compila este archivo para obtener el archivo EXTERN1.OBJ.

En el archivo EXTERN2.CPP se declaran las variable edad y nombre utilizando el modificador extern.

Finalmente, se crea un proyecto al que puede llamarse EXTERN.PRJ, en el cual se incluyen los archivos EXTERN1.OBJ y EXTERN2.CPP; se compila el proyecto y se obtiene el archivo ejecutable EXTERN.EXE

Página anterior Página siguiente