Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐