Attention! Your ePaper is waiting for publication!
By publishing your document, the content will be optimally indexed by Google via AI and sorted into the right category for over 500 million ePaper readers on YUMPU.
This will ensure high visibility and many readers!
Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />
3.9.2. Convertir variables y expresiones <strong>en</strong> cad<strong>en</strong>as<br />
Cuando se escribe código de depuración, resulta pesado escribir expresiones<br />
print que consist<strong>en</strong> <strong>en</strong> una cad<strong>en</strong>a que conti<strong>en</strong>e el nombre de una variable, seguido<br />
de el valor de la variable. Afortunadam<strong>en</strong>te, el C estándar incluye el operador<br />
de FIXME cad<strong>en</strong>ización #, que ya se usó antes <strong>en</strong> este mismo capítulo. Cuando se<br />
coloca un # antes de una argum<strong>en</strong>tos <strong>en</strong> una macro, el preprocesador convierte ese<br />
argum<strong>en</strong>tos <strong>en</strong> una cad<strong>en</strong>a. Esto, combinado con el hecho de que las cad<strong>en</strong>as no indexadas<br />
colocadas una a continuación de la otra se concat<strong>en</strong>an, permite crear macros<br />
muy adecuadas para imprimir los valores de las variables durante la depuración:<br />
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 126 — #164 ✐ Capítulo 3. C <strong>en</strong> <strong>C++</strong> 3.9.2. Convertir variables y expresiones <strong>en</strong> cad<strong>en</strong>as Cuando se escribe código de depuración, resulta pesado escribir expresiones print que consist<strong>en</strong> <strong>en</strong> una cad<strong>en</strong>a que conti<strong>en</strong>e el nombre de una variable, seguido de el valor de la variable. Afortunadam<strong>en</strong>te, el C estándar incluye el operador de FIXME cad<strong>en</strong>ización #, que ya se usó antes <strong>en</strong> este mismo capítulo. Cuando se coloca un # antes de una argum<strong>en</strong>tos <strong>en</strong> una macro, el preprocesador convierte ese argum<strong>en</strong>tos <strong>en</strong> una cad<strong>en</strong>a. Esto, combinado con el hecho de que las cad<strong>en</strong>as no indexadas colocadas una a continuación de la otra se concat<strong>en</strong>an, permite crear macros muy adecuadas para imprimir los valores de las variables durante la depuración: #define PR(x) cout
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 127 — #165 ✐ 3.10. Direcciones de función using namespace std; int main() { int i = 100; assert(i != 100); // Fails } ///:~ La macro original es C Estándar, así que está disponible también <strong>en</strong> el fichero de cabecera assert.h. Cuando haya terminado la depuración, puede eliminar el código g<strong>en</strong>erado por la macro escribi<strong>en</strong>do la sigui<strong>en</strong>te línea: #define NDEBUG <strong>en</strong> el programa, antes de la inclusión de , o defini<strong>en</strong>do NDEBUG <strong>en</strong> la línea de comandos del compilador. NDEBUG es una bandera que se usa <strong>en</strong> para cambiar el código g<strong>en</strong>erado por las macros. Más adelante <strong>en</strong> este libro, verá algunas alternativas más sofisticadas a assert- (). 3.10. Direcciones de función Una vez que una función es compilada y cargada <strong>en</strong> la computadora para ser ejecutada, ocupa un trozo de memoria. Esta memoria, y por tanto esa función, ti<strong>en</strong>e una dirección. C nunca ha sido un l<strong>en</strong>guaje [FIXME] donde otros tem<strong>en</strong> pisar. Puede usar direcciones de función con punteros igual que puede usar direcciones variables. La declaración y uso de punteros a función parece un poco opaca al principio, pero sigue el formato del resto del l<strong>en</strong>guaje. 3.10.1. Definición de un puntero a función Para definir un puntero a una función que no ti<strong>en</strong>e argum<strong>en</strong>tos y no retorna nada, se dice: void (*funcPtr)(); Cuando se observa una definición compleja como esta, el mejor método para <strong>en</strong>t<strong>en</strong>derla es empezar <strong>en</strong> el medio e ir hacia afuera. «Empezar <strong>en</strong> el medio» significa empezar con el nombre de la variable, que es funPtr. «Ir hacia afuera» significa mirar al elem<strong>en</strong>to inmediatam<strong>en</strong>te a la derecha (nada <strong>en</strong> este caso; el paréntesis derecho marca el fin de ese elem<strong>en</strong>to), después mire a la izquierda (un puntero d<strong>en</strong>otado por el asterisco), después mirar de nuevo a la derecha (una lista de argum<strong>en</strong>tos vacía que indica que no función no toma argum<strong>en</strong>tos), después a la izquierda (void, que indica que la función no retorna nada). Este movimi<strong>en</strong>to derecha-izquierda-derecha funciona con la mayoría de las declaraciones. 6 6 (N. del T.) Otra forma similar de <strong>en</strong>t<strong>en</strong>derlo es dibujar m<strong>en</strong>talm<strong>en</strong>te una espiral que empieza <strong>en</strong> el medio (el id<strong>en</strong>tificador) y se va abri<strong>en</strong>do. 127 ✐ ✐ ✐ ✐