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 93 — #131<br />

✐<br />

3.6. Especificar la ubicación del espacio de almac<strong>en</strong>ami<strong>en</strong>to<br />

Cuando el compilador <strong>en</strong>cu<strong>en</strong>tra la declaración extern int i sabe que la definición<br />

para i debe existir <strong>en</strong> algún sitio como una variable global. Cuando el compilador<br />

alcanza la definición de i, ninguna otra declaración es visible, de modo que<br />

sabe que ha <strong>en</strong>contrado la misma i declarada anteriorm<strong>en</strong>te <strong>en</strong> el fichero. Si se hubiera<br />

definido i como static, estaría indicando al compilador que i se define globalm<strong>en</strong>te<br />

(por extern), pero también que ti<strong>en</strong>e el ámbito de fichero (por static),<br />

de modo que el compilador g<strong>en</strong>erará un error.<br />

Enlazado<br />

Para compr<strong>en</strong>der el comportami<strong>en</strong>to de los programas C y <strong>C++</strong>, es necesario<br />

saber sobre <strong>en</strong>lazado. En un programa <strong>en</strong> ejecución, un id<strong>en</strong>tificador se repres<strong>en</strong>ta<br />

con espacio <strong>en</strong> memoria que aloja una variable o un cuerpo de función compilada.<br />

El <strong>en</strong>lazado describe este espacio tal como lo ve el <strong>en</strong>lazador. Hay dos formas de<br />

<strong>en</strong>lazado: <strong>en</strong>lace interno y <strong>en</strong>lace externo.<br />

Enlace interno significa que el espacio se pide para repres<strong>en</strong>tar el id<strong>en</strong>tificador sólo<br />

durante la compilación del fichero. Otros ficheros pued<strong>en</strong> utilizar el mismo nombre<br />

de id<strong>en</strong>tificador con un <strong>en</strong>lace interno, o para una variable global, y el <strong>en</strong>lazador<br />

no <strong>en</strong>contraría conflictos - se pide un espacio separado para cada id<strong>en</strong>tificador. El<br />

<strong>en</strong>lace interno se especifica mediante la palabra reservada static <strong>en</strong> C y <strong>C++</strong>.<br />

Enlace externo significa que se pide sólo un espacio para repres<strong>en</strong>tar el id<strong>en</strong>tificador<br />

para todos los ficheros que se estén compilando. El espacio se pide una vez, y<br />

el <strong>en</strong>lazador debe resolver todas las demás refer<strong>en</strong>cias a esa ubicación. Las variables<br />

globales y los nombres de función ti<strong>en</strong><strong>en</strong> <strong>en</strong>lace externo. Son accesibles desde otros<br />

ficheros declarándolas con la palabra reservada extern. Por defecto, las variables<br />

definidas fuera de todas las funciones (con la excepción de const <strong>en</strong> <strong>C++</strong>) y las definiciones<br />

de las funciones implican <strong>en</strong>lace externo. Se pued<strong>en</strong> forzar específicam<strong>en</strong>te<br />

a t<strong>en</strong>er <strong>en</strong>lace interno utilizando static. Se puede establecer explícitam<strong>en</strong>te que un<br />

id<strong>en</strong>tificador ti<strong>en</strong>e <strong>en</strong>lace externo definiéndolo como extern. No es necesario definir<br />

una variable o una función como extern <strong>en</strong> C, pero a veces es necesario para<br />

const <strong>en</strong> <strong>C++</strong>.<br />

Las variables automáticas (locales) exist<strong>en</strong> sólo temporalm<strong>en</strong>te, <strong>en</strong> la pila, mi<strong>en</strong>tras<br />

se está ejecutando una función. El <strong>en</strong>lazador no <strong>en</strong>ti<strong>en</strong>de de variables automáticas,<br />

de modo que no ti<strong>en</strong><strong>en</strong> <strong>en</strong>lazado.<br />

3.6.5. Constantes<br />

En el antiguo C (pre-Estándar), si se deseaba crear una constante, se debía utilizar<br />

el preprocesador:<br />

#define PI 3.14159<br />

En cualquier sitio <strong>en</strong> el que utilizase PI, el preprocesador lo substituía por el valor<br />

3.14159 (aún se puede utilizar este método <strong>en</strong> C y <strong>C++</strong>).<br />

Cuando se utiliza el preprocesador para crear constantes, su control queda fuera<br />

del ámbito del compilador. No existe ninguna comprobación de tipo y no se puede<br />

obt<strong>en</strong>er la dirección de PI (de modo que no se puede pasar un puntero o una refer<strong>en</strong>cia<br />

a PI). PI no puede ser una variable de un tipo definido por el usuario. El<br />

significado de PI dura desde el punto <strong>en</strong> que es definida, hasta el final del fichero; el<br />

preprocesador no <strong>en</strong>ti<strong>en</strong>de de ámbitos.<br />

93<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!