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 227 — #265<br />
✐<br />
8.1. Sustitución de valores<br />
extern const int bufsize;<br />
// es ódeclaracin, no ódefinicin<br />
Esta declaración también es válida <strong>en</strong> C.<br />
En <strong>C++</strong>, const no implica necesariam<strong>en</strong>te almac<strong>en</strong>ami<strong>en</strong>to. En C, las constantes<br />
siempre necesitan almac<strong>en</strong>ami<strong>en</strong>to. El hecho de que se necesite almac<strong>en</strong>ami<strong>en</strong>to o no<br />
dep<strong>en</strong>de de cómo se use la constante. En g<strong>en</strong>eral, si una constante se usa simplem<strong>en</strong>te<br />
para reemplazar un número por un nombre (como hace #define), <strong>en</strong>tonces no<br />
requiere almac<strong>en</strong>ami<strong>en</strong>to. Si es así (algo que dep<strong>en</strong>de de la complejidad del tipo de<br />
dato y de lo sofisticación del compilador) los valores pued<strong>en</strong> expandirse <strong>en</strong> el código<br />
para conseguir mayor efici<strong>en</strong>cia después de la comprobación de los tipos, no como<br />
con #define. Si de todas formas, se necesita la dirección de una constante (aún desconocida,<br />
para pasarla a una función como argum<strong>en</strong>to por refer<strong>en</strong>cia) o se declara<br />
como extern, <strong>en</strong>tonces se requiere asignar almac<strong>en</strong>ami<strong>en</strong>to para la constante.<br />
En <strong>C++</strong>, una constante que esté definida fuera de todas las funciones ti<strong>en</strong>e ámbito<br />
de archivo (es decir, es inaccesible fuera del archivo). Esto significa que usa <strong>en</strong>lace<br />
interno. Esto es difer<strong>en</strong>te para el resto de id<strong>en</strong>tificadores <strong>en</strong> <strong>C++</strong> (y que las constantes<br />
<strong>en</strong> C) que utilizan siempre <strong>en</strong>lace externo. Por eso, si declara una constante con<br />
el mismo nombre <strong>en</strong> dos archivos difer<strong>en</strong>tes y no toma sus direcciones ni los define<br />
como extern, el compilador <strong>C++</strong> ideal no asignará almac<strong>en</strong>ami<strong>en</strong>to para la constante,<br />
simplem<strong>en</strong>te la expandirá <strong>en</strong> el código. Como las constantes ti<strong>en</strong><strong>en</strong> implícito<br />
el ámbito a su archivo, puede ponerlas <strong>en</strong> un archivo de cabecera de <strong>C++</strong> sin que<br />
origine conflictos <strong>en</strong> el <strong>en</strong>lace.<br />
Dado que las constante <strong>en</strong> <strong>C++</strong> utilizan por defecto <strong>en</strong>lace interno, no puede definir<br />
una constante <strong>en</strong> un archivo y utilizarla desde otro. Para conseguir <strong>en</strong>lace externo<br />
para la constante y así poder usarla desde otro archivo, debe definirla explícitam<strong>en</strong>te<br />
como extern, algo así:<br />
extern const int x = 1;<br />
// ódefinicin, no ódeclaracin<br />
Señalar que dado un id<strong>en</strong>tificador, si se dice que es extern, se fuerza el almac<strong>en</strong>ami<strong>en</strong>to<br />
para la constante (aunque el compilador t<strong>en</strong>ga la opción de hacer la expansión<br />
<strong>en</strong> ese punto). La inicialización establece que la s<strong>en</strong>t<strong>en</strong>cia es una definición,<br />
no una declaración. La declaración:<br />
extern const int x;<br />
<strong>en</strong> <strong>C++</strong> significa que la definición existe <strong>en</strong> algún sitio (mi<strong>en</strong>tras que <strong>en</strong> C no<br />
ti<strong>en</strong>e porqué ocurrir así). Ahora puede ver porqué <strong>C++</strong> requiere que las definiciones<br />
de constantes incluyan la inicialización: la inicialización difer<strong>en</strong>cia una declaración<br />
de una definición (<strong>en</strong> C siempre es una definición, aunque no esté inicializada). Con<br />
una declaración const extern, el compilador no hace expansión de la constante<br />
porque no conoce su valor.<br />
La aproximación de C a las constantes es poco útil, y si quiere usar un valor simbólico<br />
<strong>en</strong> una expresión constante (que deba evaluarse <strong>en</strong> tiempo de compilación)<br />
casi está obligado a usar #define.<br />
227<br />
✐<br />
✐<br />
✐<br />
✐