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 251 — #289<br />
✐<br />
9: Funciones inline<br />
Una de las características más importantes que <strong>C++</strong> hereda de C es<br />
la efici<strong>en</strong>cia. Si la efici<strong>en</strong>cia de <strong>C++</strong> fuese dramáticam<strong>en</strong>te m<strong>en</strong>or que<br />
la de C, podría haber un conting<strong>en</strong>te significativo de programadores<br />
que no podrían justificar su uso.<br />
En C, una de las maneras de preservar la efici<strong>en</strong>cia es mediante el uso de macros,<br />
lo que permite hacer lo que parece una llamada a una función sin la sobrecarga habitual<br />
de la llamada a función. La macro está implem<strong>en</strong>tada con el preprocesador <strong>en</strong><br />
vez del propio compilador, y el preprocesador reemplaza todas las llamadas a macros<br />
directam<strong>en</strong>te con el código de la macro, de manera que no hay que complicarse<br />
pasando argum<strong>en</strong>tos, escribi<strong>en</strong>do código de <strong>en</strong>samblador para CALL, retornando argum<strong>en</strong>tos<br />
ni implem<strong>en</strong>tando código <strong>en</strong>samblador para el RETURN. Todo el trabajo lo<br />
realizar el preprocesador, de manera que se ti<strong>en</strong>e la coher<strong>en</strong>cia y legibilidad de una<br />
llamada a una función pero sin ningún coste.<br />
Hay dos problemas respecto al uso del preprocesador con macros <strong>en</strong> <strong>C++</strong>. La primera<br />
también existe <strong>en</strong> C: una macro parece una llamada a función, pero no siempre<br />
actúa como tal. Esto puede acarrear dificultades para <strong>en</strong>contrar errores. El segundo<br />
problema es específico de <strong>C++</strong>: el preprocesador no ti<strong>en</strong>e permisos para acceder a la<br />
información de los miembros de una clase. Esto significa que las macros de preprocesador<br />
no pued<strong>en</strong> usarse como métodos de una clase.<br />
Para mant<strong>en</strong>er la efici<strong>en</strong>cia del uso del preprocesador con macros pero añadi<strong>en</strong>do<br />
la seguridad y la semántica de ámbito de verdaderas funciones <strong>en</strong> las clases. <strong>C++</strong><br />
ti<strong>en</strong>e las funciones inline. En este capítulo veremos los problemas del uso de las<br />
maros de preprocesador <strong>en</strong> <strong>C++</strong>, cómo se resuelv<strong>en</strong> estos problemas con funciones<br />
inline, y las directrices e incursiones <strong>en</strong> la forma <strong>en</strong> que trabajan las funciones<br />
inline.<br />
9.1. Los peligros del preprocesador<br />
La clave de los problemas con las macros de preprocesador radica <strong>en</strong> que puedes<br />
caer <strong>en</strong> el error de p<strong>en</strong>sar que el comportami<strong>en</strong>to del preprocesador es igual que<br />
el del compilador. Por supuesto, la int<strong>en</strong>ción era que una macro se parezca y actúe<br />
como una llamada a una función, por eso es bastante fácil caer <strong>en</strong> este error. Las<br />
dificultades comi<strong>en</strong>zan cuando las difer<strong>en</strong>cias aparec<strong>en</strong> subyac<strong>en</strong>tes.<br />
Consideremos un ejemplo s<strong>en</strong>cillo:<br />
#define F (x) (x + 1)<br />
251<br />
✐<br />
✐<br />
✐<br />
✐