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