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 207 — #245<br />

✐<br />

7.1. Más decoración de nombres<br />

ningún estándar de decoración, podrá obt<strong>en</strong>er resultados difer<strong>en</strong>tes de un compilador<br />

a otro. (Puede ver lo que saldría diciéndole al compilador que g<strong>en</strong>ere código<br />

fu<strong>en</strong>te <strong>en</strong> <strong>en</strong>samblador). Esto, por supuesto, causa problemas si desea comprar unas<br />

librerías compiladas por un compilador y <strong>en</strong>lazador particulares, aunque si la decoración<br />

de nombres fuera estándar, habría otros obstáculos debido a las difer<strong>en</strong>cias de<br />

g<strong>en</strong>eración de código máquina <strong>en</strong>tre compiladores.<br />

Esto es todo lo que hay para la sobrecarga de funciones: puede utilizar el mismo<br />

nombre de función siempre y cuando la lista de argum<strong>en</strong>tos sea difer<strong>en</strong>te. El compilador<br />

utiliza el nombre, el ámbito y la lista de argum<strong>en</strong>tos para g<strong>en</strong>erar un nombre<br />

interno que el <strong>en</strong>lazador pueda utilizar.<br />

7.1.1. Sobrecarga <strong>en</strong> el valor de retorno<br />

Es muy común la pregunta «¿Por qué solam<strong>en</strong>te el ámbito y la lista de argum<strong>en</strong>tos<br />

¿Por qué no también el valor de retorno». A primera vista parece que t<strong>en</strong>dría<br />

s<strong>en</strong>tido utilizar también el valor de retorno para la decoración del nombre interno.<br />

De esta manera, también podría sobrecargar con los valores de retorno:<br />

void f();<br />

int f();<br />

Esto funciona bi<strong>en</strong> cuando el compilador puede determinar sin ambigüedades a<br />

qué tipo de valor de retorno se refiere, como <strong>en</strong> int x = f();. No obstante, <strong>en</strong> C<br />

se puede llamar a una función y hacer caso omiso del valor de retorno (esto es, puede<br />

querer llamar a la función debido a sus efectos laterales). ¿Cómo puede el compilador<br />

distinguir a qué función se refiere <strong>en</strong> este caso Peor es la dificultad que ti<strong>en</strong>e el lector<br />

del código fu<strong>en</strong>te para dilucidar a qué función se refiere. La sobrecarga mediante el<br />

valor de retorno solam<strong>en</strong>te es demasiado sutil, por lo que <strong>C++</strong> no lo permite.<br />

7.1.2. Enlace con FIXME:tipos seguros<br />

Existe un b<strong>en</strong>eficio añadido a la decoración de nombres. En C hay un problema<br />

particularm<strong>en</strong>te fastidioso cuando un programador cli<strong>en</strong>te declara mal una función<br />

o, aún peor, se llama a una función sin haber sido previam<strong>en</strong>te declarada, y el compilador<br />

infiere la declaración de la función mediante la forma <strong>en</strong> que se llama. Algunas<br />

veces la declaración de la función es correcta, pero cuando no lo es, suele resultar <strong>en</strong><br />

un fallo difícil de <strong>en</strong>contrar.<br />

A causa de que <strong>en</strong> <strong>C++</strong> se deb<strong>en</strong> declarar todas las funciones antes de llamarlas,<br />

las probabilidades de que ocurra lo anteriorm<strong>en</strong>te expuesto se reduc<strong>en</strong> drásticam<strong>en</strong>te.<br />

El compilador de <strong>C++</strong> rechaza declarar una función automáticam<strong>en</strong>te, así que es<br />

probable que t<strong>en</strong>ga que incluir la cabecera apropiada. Sin embargo, si por alguna<br />

razón se las apaña para declarar mal una función, o declararla a mano o incluir una<br />

cabecera incorrecta (quizá una que sea antigua), la decoración de nombres proporciona<br />

una seguridad que a m<strong>en</strong>udo se d<strong>en</strong>omina como <strong>en</strong>lace con tipos seguros.<br />

Considere el sigui<strong>en</strong>te esc<strong>en</strong>ario. En un fichero está la definición de una función:<br />

//: C07:Def.cpp {O}<br />

// Function definition<br />

void f(int) {}<br />

///:~<br />

207<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!