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 302 — #340<br />
✐<br />
Capítulo 10. Control de nombres<br />
10.5. Especificaciones de <strong>en</strong>lazado alternativo<br />
¿Qué pasa si está escribi<strong>en</strong>do un programa <strong>en</strong> <strong>C++</strong> y quiere usar una librería de<br />
C Si hace uso de la declaración de funciones de C,<br />
float f(int a, char b);<br />
el compilador de <strong>C++</strong> adornará el nombre como algo tipo _f_int_char para<br />
permitir la sobrecarga de la función (y el <strong>en</strong>lazado con verificación de tipos). De todas<br />
formas, el compilador de C que compiló su librería C definitivam<strong>en</strong>te no decoró<br />
ese nombre, por lo que su nombre interno será _f. Así pues, el <strong>en</strong>lazador no será<br />
capaz de resolver sus llamadas tipo <strong>C++</strong> a f().<br />
La forma de resolver esto que se propone <strong>en</strong> <strong>C++</strong> es la especificación de <strong>en</strong>lazado<br />
alternativo, que se produjo <strong>en</strong> el l<strong>en</strong>guaje sobrecargando la palabra clave extern. A<br />
la palabra clave extern le sigue una cad<strong>en</strong>a que especifica el <strong>en</strong>lazado deseado para<br />
la declaración, seguido por la declaración:<br />
extern "C" float f(int a, char b);<br />
Esto le dice al compilador que f() ti<strong>en</strong>e <strong>en</strong>lazado tipo C, de forma que el compilador<br />
no decora el nombre. Las dos únicas especificaciones de <strong>en</strong>lazado soportadas<br />
por el estándar son «C» y «<strong>C++</strong>», pero algunos v<strong>en</strong>dedores ofrec<strong>en</strong> compiladores<br />
que también soportan otros l<strong>en</strong>guajes.<br />
Si ti<strong>en</strong>e un grupo de declaraciones con <strong>en</strong>lazado alternativo, póngalas <strong>en</strong>tre llaves,<br />
como a continuación:<br />
extern "C" {<br />
float f(int a, char b);<br />
double d(int a, char b);<br />
}<br />
O, para archivos de cabecera,<br />
extern "C" {<br />
#include "Myheader.h"<br />
}<br />
La mayoría de compiladores disponibles de <strong>C++</strong> manejan las especificaciones de<br />
<strong>en</strong>lazado alternativo d<strong>en</strong>tro de sus propios archivos de cabecera que trabajan tanto<br />
con C como con <strong>C++</strong>, por lo que no ti<strong>en</strong>e que preocuparse de eso.<br />
10.6. Resum<strong>en</strong><br />
302<br />
La palabra clave static puede llevar a confusión porque <strong>en</strong> algunas situaciones<br />
controla la reserva de espacio <strong>en</strong> memoria, y <strong>en</strong> otras controla la visibilidad y<br />
<strong>en</strong>lazado del nombre.<br />
Con la introducción de los espacios de nombres de <strong>C++</strong>, dispone de una alternativa<br />
mejorada y más flexible para controlar la proliferación de nombres <strong>en</strong> proyectos<br />
grandes.<br />
✐<br />
✐<br />
✐<br />
✐