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 252 — #290<br />

✐<br />

Capítulo 9. Funciones inline<br />

Ahora, si hacemos una llamada a F de esta manera:<br />

F(1)<br />

El preprocesador la expande de manera inesperada:<br />

(x) (x + 1)(1)<br />

El problema se debe al espacio <strong>en</strong>tre `F` y su paréntesis de apertura <strong>en</strong> la definición<br />

de la macro. Cuando el espacio es eliminado <strong>en</strong> el código de la macro, puedes<br />

llamar a la función incluso incluy<strong>en</strong>do el espacio.<br />

F (1)<br />

Y se expandirá de manera correcta a lo sigui<strong>en</strong>te:<br />

(1 + 1)<br />

El ejemplo anterior es un poco trivial y el problema es demasiado evid<strong>en</strong>te. Las<br />

dificultades reales ocurr<strong>en</strong> cuando se usan expresiones como argum<strong>en</strong>tos <strong>en</strong> llamadas<br />

a macros.<br />

Hay dos problemas. El primero es que las expresiones pued<strong>en</strong> expandirse d<strong>en</strong>tro<br />

de la macro de modo que la preced<strong>en</strong>cia de la evaluación es difer<strong>en</strong>te a lo que cabría<br />

esperar. Por ejemplo:<br />

#define FLOOR(x,b) x>=b0:1<br />

Ahora, si usamos expresiones como argum<strong>en</strong>tos:<br />

if (FLOOR(a&0x0f,0x07)) // ...<br />

La macro se expandiría a:<br />

if (a&0x0f>=0x070:1)<br />

La preced<strong>en</strong>cia del & es m<strong>en</strong>or que la del >=, de modo que la evaluación de la<br />

macro te sorpr<strong>en</strong>derá. Una vez hayas descubierto el problema, puedes solucionarlo<br />

insertando paréntesis a todo lo que hay d<strong>en</strong>tro de la definición de la macro. (Este es<br />

un bu<strong>en</strong> método a seguir cuando defina macros de preprocesador), algo como:<br />

#define FLOOR(x,b) ((x)>=(b)0:1)<br />

De cualquier manera, descubrir el problema puede ser difícil, y no dará con él<br />

hasta después de haber dado por s<strong>en</strong>tado el comportami<strong>en</strong>to de la macro <strong>en</strong> sí misma.<br />

En la versión sin paréntesis de la macro anterior, la mayoría de las expresiones<br />

van a actuar de manera correcta a causa de la preced<strong>en</strong>cia de >=, que es m<strong>en</strong>or que<br />

la mayoría de los operadores como +, /, --, e incluso los operadores de desplazami<strong>en</strong>to.<br />

Por lo que puede p<strong>en</strong>sar que funciona con todas las expresiones, incluy<strong>en</strong>do<br />

aquellas que emple<strong>en</strong> operadores lógicos a nivel de bit.<br />

252<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!