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

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

Saved successfully!

Ooh no, something went wrong!