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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 269 — #307<br />

✐<br />

9.7. Comprobación de errores mejorada<br />

9.6.1. Encolado de símbolos<br />

El <strong>en</strong>colado de símbolos, implem<strong>en</strong>tado con la directiva ##, es muy útil cuando<br />

se g<strong>en</strong>era código. Permite coger dos id<strong>en</strong>tificadores y pegarlos juntos para crear un<br />

nuevo id<strong>en</strong>tificador automáticam<strong>en</strong>te. Por ejemplo,<br />

#define FIELD(a) char* a##_string; int a##_size<br />

class Record {<br />

FIELD(one);<br />

FIELD(two);<br />

FIELD(three);<br />

// ...<br />

};<br />

Cada llamada a la macro FIELD() crea un id<strong>en</strong>tificador para una cad<strong>en</strong>a de<br />

caracteres y otro para la longitud de dicha cad<strong>en</strong>a. No solo es fácil de leer, también<br />

puede eliminar errores de codificación y facilitar el mant<strong>en</strong>imi<strong>en</strong>to.<br />

9.7. Comprobación de errores mejorada<br />

Las funciones de require.h se han usado antes de este punto sin haberlas definido<br />

(aunque assert() se ha usado también para ayudar a detectar errores del<br />

programador donde es apropiado). Ahora es el mom<strong>en</strong>to de definir este fichero de<br />

cabecera. Las funciones inline son conv<strong>en</strong>i<strong>en</strong>tes aquí porque permit<strong>en</strong> colocar todo<br />

<strong>en</strong> el fichero de cabecera, lo que simplifica el proceso para usar el paquete. Simplem<strong>en</strong>te,<br />

incluya el fichero de cabecera y se preocupe por <strong>en</strong>lazar un fichero de<br />

implem<strong>en</strong>tación.<br />

Debería fijarse que las excepciones (pres<strong>en</strong>tadas <strong>en</strong> detalle <strong>en</strong> el Volum<strong>en</strong> 2 de<br />

este libro) proporcionan una forma mucho más efectiva de manejar muchos tipos de<br />

errores -especialm<strong>en</strong>te aquellos de los que debería recuperarse- <strong>en</strong> lugar de simplem<strong>en</strong>te<br />

abortar el programa. Las condiciones que maneja require.h, sin embargo,<br />

son algunas que impid<strong>en</strong> que el programa continúe, como por ejemplo que el usuario<br />

no introdujo sufici<strong>en</strong>tes argum<strong>en</strong>tos <strong>en</strong> la línea de comandos o que un fichero no<br />

se puede abrir. De modo que es aceptable que us<strong>en</strong> la función exit() de la librería<br />

C estándar.<br />

El sigui<strong>en</strong>te fichero de cabecera está <strong>en</strong> el directorio raíz del libro, así que es fácilm<strong>en</strong>te<br />

accesible desde todos los capítulos.<br />

//: :require.h<br />

// From Thinking in <strong>C++</strong>, 2nd Edition<br />

// Available at http://www.BruceEckel.com<br />

// (c) Bruce Eckel 2000<br />

// Copyright notice in Copyright.txt<br />

// Test for error conditions in programs<br />

// Local "using namespace std" for old compilers<br />

#ifndef REQUIRE_H<br />

#define REQUIRE_H<br />

#include <br />

#include <br />

#include <br />

#include <br />

inline void require(bool requirem<strong>en</strong>t,<br />

269<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!