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

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

Saved successfully!

Ooh no, something went wrong!