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 226 — #264<br />
✐<br />
Capítulo 8. Constantes<br />
permite al compilador g<strong>en</strong>erar código más efici<strong>en</strong>te ahorrando espacio de almac<strong>en</strong>ami<strong>en</strong>to<br />
y lecturas de memoria <strong>en</strong> la ejecución del programa.<br />
8.1.3. Vectores<br />
Es posible usar constantes para los vectores, pero prácticam<strong>en</strong>te está dando por<br />
hecho que el compilador no será lo sufici<strong>en</strong>tem<strong>en</strong>te sofisticado para mant<strong>en</strong>er un<br />
vector <strong>en</strong> la tabla de símbolos, así que le asignará espacio de almac<strong>en</strong>ami<strong>en</strong>to. En<br />
estas situaciones, const significa «un conjunto de datos <strong>en</strong> memoria que no pued<strong>en</strong><br />
modificarse». En cualquier caso, sus valores no puede usarse <strong>en</strong> tiempo de compilación<br />
porque el compilador no conoce <strong>en</strong> ese mom<strong>en</strong>to los cont<strong>en</strong>idos de las variables<br />
que ti<strong>en</strong><strong>en</strong> espacio asignado. En el código sigui<strong>en</strong>te puede ver algunas declaraciones<br />
incorrectas.<br />
//: C08:Constag.cpp<br />
// Constants and aggregates<br />
const int i[] = { 1, 2, 3, 4 };<br />
//! float f[i[3]]; // Illegal<br />
struct S { int i, j; };<br />
const S s[] = { { 1, 2 }, { 3, 4 } };<br />
//! double d[s[1].j]; // Illegal<br />
int main() {} ///:~<br />
En la definición de un vector, el compilador debe ser capaz de g<strong>en</strong>erar código<br />
que mueva el puntero de pila para dar cabida al vector. En las definiciones incorrectas<br />
anteriores, el compilador se queja porque no puede <strong>en</strong>contrar una expresión<br />
constante <strong>en</strong> la definición del tamaño del vector.<br />
8.1.4. Difer<strong>en</strong>cias con C<br />
Las constantes se introdujeron <strong>en</strong> las primeras versiones de <strong>C++</strong> mi<strong>en</strong>tras la especificación<br />
del estándar C estaba si<strong>en</strong>do terminada. Aunque el comité a cargo de C<br />
decidió <strong>en</strong>tonces incluir const <strong>en</strong> C, por alguna razón, vino a significar para ellos<br />
«una variable ordinaria que no puede cambiarse». En C, una constante siempre ocupa<br />
espacio de almac<strong>en</strong>ami<strong>en</strong>to y su ámbito es global. El compilador C no puede<br />
tratar const como una constante <strong>en</strong> tiempo de compilación. En C, si escribe:<br />
const int bufsize = 100;<br />
char buf[bufsize];<br />
aparecerá un error, aunque parezca algo razonable. bufsize está guardado <strong>en</strong><br />
algún sitio y el compilador no conoce su valor <strong>en</strong> tiempo de compilación. Opcionalm<strong>en</strong>te<br />
puede escribir:<br />
const int bufsize;<br />
<strong>en</strong> C, pero no <strong>en</strong> <strong>C++</strong>, y el compilador C lo acepta como una declaración que<br />
indica que se almac<strong>en</strong>ará <strong>en</strong> alguna parte. Como C utiliza <strong>en</strong>lace externo para las<br />
constantes, esa semántica ti<strong>en</strong>e s<strong>en</strong>tido. <strong>C++</strong> utiliza normalm<strong>en</strong>te <strong>en</strong>lace interno, así<br />
que, si quiere hacer lo mismo <strong>en</strong> <strong>C++</strong>, debe indicar expresam<strong>en</strong>te que se use <strong>en</strong>lace<br />
externo usando extern.<br />
226<br />
✐<br />
✐<br />
✐<br />
✐