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 224 — #262<br />

✐<br />

Capítulo 8. Constantes<br />

de valores al terr<strong>en</strong>o del compilador. Ahora, puede escribir:<br />

const int bufsize = 100;<br />

Puede colocar bufsize <strong>en</strong> cualquier lugar donde se necesite conocer el valor<br />

<strong>en</strong> tiempo de compilación. El compilador utiliza bufsize para hacer propagación de<br />

constantes 1 , que significa que el compilador reduce una expresión constante complicada<br />

a un valor simple realizando los cálculos necesarios <strong>en</strong> tiempo de compilación.<br />

Esto es especialm<strong>en</strong>te importante <strong>en</strong> las definiciones de vectores:<br />

char buf[bufsize];<br />

Puede usar const con todos los tipos básicos(char, int, float y double) y sus variantes<br />

(así como clases y todo lo que verá después <strong>en</strong> este capítulo). Debido a los<br />

problemas que introduce el preprocesador deberá utilizar siempre const <strong>en</strong> lugar<br />

de #define para la sustitución de valores.<br />

8.1.1. const <strong>en</strong> archivos de cabecera<br />

Para poder usar const <strong>en</strong> lugar de #define, debe ser posible colocar las definiciones<br />

const <strong>en</strong> los archivos de cabecera como se hacía con los #define. De este<br />

modo, puede colocar la definición de una constante <strong>en</strong> un único lugar y distribuirla<br />

incluy<strong>en</strong>do el archivo de cabecera <strong>en</strong> las unidades del programa que la necesit<strong>en</strong>.<br />

Una constante <strong>en</strong> <strong>C++</strong> utiliza <strong>en</strong>lazado interno, es decir, es visible sólo desde el archivo<br />

donde se define y no puede verse <strong>en</strong> tiempo de <strong>en</strong>lazado por otros módulos.<br />

Deberá asignar siempre un valor a las constantes cuando las defina, excepto cuando<br />

explícitam<strong>en</strong>te use la declaración extern:<br />

extern const int bufsize;<br />

Normalm<strong>en</strong>te el compilador de <strong>C++</strong> evita la asignación de memoria para las<br />

constantes, pero <strong>en</strong> su lugar ocupa una <strong>en</strong>trada <strong>en</strong> la tabla de símbolos. Cuando<br />

se utiliza extern con una constante, se fuerza el alojami<strong>en</strong>to <strong>en</strong> memoria (esto también<br />

ocurre <strong>en</strong> otros casos, como cuando se solicita la dirección de una constante).<br />

El uso de la memoria debe hacerse porque extern dice «usa <strong>en</strong>lazado externo», es<br />

decir, que varios módulos deb<strong>en</strong> ser capaces de hacer refer<strong>en</strong>cia al elem<strong>en</strong>to, algo<br />

que requiere su almac<strong>en</strong>ami<strong>en</strong>to <strong>en</strong> memoria.<br />

Por lo g<strong>en</strong>eral, cuando extern no forma parte de la definición, no se pide memoria.<br />

Cuando la constante se utiliza simplem<strong>en</strong>te se incorpora <strong>en</strong> tiempo de compilación.<br />

El objetivo de no almac<strong>en</strong>ar <strong>en</strong> memoria las constantes tampoco se cumple con<br />

estructuras complicadas. Cuando el compilador se ve obligado a pedir memoria no<br />

puede realizar propagación de constantes (ya que el compilador no ti<strong>en</strong>e forma de conocer<br />

con seguridad que valor debe almac<strong>en</strong>ar; si lo conociese, no necesitaría pedir<br />

memoria).<br />

Como el compilador no siempre puede impedir el almac<strong>en</strong>ami<strong>en</strong>to para una<br />

constante, las definiciones de constantes utilizan <strong>en</strong>lace interno, es decir, se <strong>en</strong>lazan<br />

sólo con el módulo <strong>en</strong> que se defin<strong>en</strong>. En caso contrario, los errores de <strong>en</strong>lace podrían<br />

ocurrir con las expresiones constantes complicadas ya que causarían petición<br />

1 N. del T.: del inglés constant folding<br />

224<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!