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

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

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

Saved successfully!

Ooh no, something went wrong!