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 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 />
✐