lunes, 28 de mayo de 2007

Secretos de C++

EliuX [aorozco@infomed.sld.cu]

¿Cómo hacer que el C/C++ no me de más errores de doble declaración?

Hay un error en el mundo de la programación en C++ que se hace muy común, sobre todo cuando estamos programando orientado a objetos y tenemos distintos archivos para guardar las clases; pero cuando un archivo está incluido en 2 archivos cabecera (.h) y hay un tercero que contiene a los 2 últimos, ése puede contener clases doblemente definidas, debido a que como son muy utilizadas por otras (cómo TLista para manejar listas de elementos), éstas aparecen declaradas en las que el tercero tiene incluidas en su cabecera, por lo que el compilador da el problema de doble declaración. La situación modelada es la siguiente:

Diagrama de clases

Cómo se ve en la figura, hay tres archivos que contienen a TLista.h y un tercero (Base de Camiones) que contiene a otros dos (Camiones.h y Choferes.h), que también tienen incluido a TLista.h en su cabecera, por lo que en BaseCamiones.h estará definido 3 veces, y eso da un error. El remedio para esta situación es el siguiente:

  • Definir una variable que indique que el archivo está definido ya.
  • Usar la directiva #pragma once.

Ejemplo:

#pragma once //Cuando el compilador compila este archivo, no lo compila más cuando lo vea incluido en otros archivos, acelerando el procedimiento de compilación.
#if !defined(_VCL_ELIUX_TLISTA_HEADER_DEFINED851106_) //Si esa constante no está definida (ocurre cuando no se ha agregado todavía el archivo), entonces
#define _VCL_ELIUX_TLISTA_HEADER_DEFINED851106_ //Define la constante en el compilador (para que no se agregue más)
template<class tipo> class TLista; //Define la lista
... //Se implementa la clase
#endif

Espero que a partir de ahora no cometan más errores de este tipo ;)

¿Cómo crear errores de prevención en C/C++?

En C++ hay una directiva que permite crear un error cuando se está compilando el programa si no se cumple una condición necesaria que permite garantizar la integridad del código. Les mostraré de que se trata con un ejemplo:

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

El código anterior es muy usado en Visual C++ y sirve para garantizar que antes de que se incluya el actual archivo, se añade el que contiene la directiva (en este caso stdafx.h), que contiene la definición que indica que ya se compiló ese encabezado.

Salida:
Si el compilador compila el actual archivo (el que contiene el código en vez de stdafx.h), el compilador reportará el error cómo si hubiese ocurrido un error de código y se mostrará el cartel: “include 'stdafx.h' before including this file for PCH". Empiecen a usarlo y verán cómo sus archivos no tendrán más problemas de doble declaración.

Para saber más...



Artículos relacionados


No hay comentarios: