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

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

Saved successfully!

Ooh no, something went wrong!