Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 127 — #165<br />
✐<br />
3.10. Direcciones de función<br />
using namespace std;<br />
int main() {<br />
int i = 100;<br />
assert(i != 100); // Fails<br />
} ///:~<br />
La macro original es C Estándar, así que está disponible también <strong>en</strong> el fichero de<br />
cabecera assert.h.<br />
Cuando haya terminado la depuración, puede eliminar el código g<strong>en</strong>erado por<br />
la macro escribi<strong>en</strong>do la sigui<strong>en</strong>te línea:<br />
#define NDEBUG<br />
<strong>en</strong> el programa, antes de la inclusión de , o defini<strong>en</strong>do NDEBUG <strong>en</strong> la<br />
línea de comandos del compilador. NDEBUG es una bandera que se usa <strong>en</strong> <br />
para cambiar el código g<strong>en</strong>erado por las macros.<br />
Más adelante <strong>en</strong> este libro, verá algunas alternativas más sofisticadas a assert-<br />
().<br />
3.10. Direcciones de función<br />
Una vez que una función es compilada y cargada <strong>en</strong> la computadora para ser<br />
ejecutada, ocupa un trozo de memoria. Esta memoria, y por tanto esa función, ti<strong>en</strong>e<br />
una dirección.<br />
C nunca ha sido un l<strong>en</strong>guaje [FIXME] donde otros tem<strong>en</strong> pisar. Puede usar direcciones<br />
de función con punteros igual que puede usar direcciones variables. La<br />
declaración y uso de punteros a función parece un poco opaca al principio, pero<br />
sigue el formato del resto del l<strong>en</strong>guaje.<br />
3.10.1. Definición de un puntero a función<br />
Para definir un puntero a una función que no ti<strong>en</strong>e argum<strong>en</strong>tos y no retorna nada,<br />
se dice:<br />
void (*funcPtr)();<br />
Cuando se observa una definición compleja como esta, el mejor método para <strong>en</strong>t<strong>en</strong>derla<br />
es empezar <strong>en</strong> el medio e ir hacia afuera. «Empezar <strong>en</strong> el medio» significa<br />
empezar con el nombre de la variable, que es funPtr. «Ir hacia afuera» significa mirar<br />
al elem<strong>en</strong>to inmediatam<strong>en</strong>te a la derecha (nada <strong>en</strong> este caso; el paréntesis derecho<br />
marca el fin de ese elem<strong>en</strong>to), después mire a la izquierda (un puntero d<strong>en</strong>otado por<br />
el asterisco), después mirar de nuevo a la derecha (una lista de argum<strong>en</strong>tos vacía<br />
que indica que no función no toma argum<strong>en</strong>tos), después a la izquierda (void, que<br />
indica que la función no retorna nada). Este movimi<strong>en</strong>to derecha-izquierda-derecha<br />
funciona con la mayoría de las declaraciones. 6<br />
6 (N. del T.) Otra forma similar de <strong>en</strong>t<strong>en</strong>derlo es dibujar m<strong>en</strong>talm<strong>en</strong>te una espiral que empieza <strong>en</strong> el<br />
medio (el id<strong>en</strong>tificador) y se va abri<strong>en</strong>do.<br />
127<br />
✐<br />
✐<br />
✐<br />
✐