- Main Page
- Classes
- Files

- File List
- File Members

# Mis documentos/UCR/Progra II/HerenciaOrdenada/ADH_port.h File Reference

Encabezado para que los programas puedan ser compilados con varios compiladores. More...

## Defines
#define | ADH_port_h
| Evita la inclusión múltiple.
#define | OPEN_namespace(N) namespace N {
| Abre namespace `"N"`.
#define | CLOSE_namespace(N) }
| Cierra namespace `"N"`.
#define | USING_namespace(N) using namespace N
| Usa namespace `"N"`.

## Detailed Description

Encabezado para que los programas puedan ser compilados con varios compiladores.

Este archivo de encabezado permite compilar los programas de `adolfo@di-mare.com` usando cualquiera de estos compiladores:

- Microsoft C++ .NET
- Microsoft C++ v6
- Borland C++ v3.1

Uso de `"namespace"`

Para permitir que el código sea compilador con el Borland C++ v3.1, que no permite usar `"namespace"`, los programas están escritos usando estas macros, que sirven para iniciar, usar y terminar un `"namespace"`:

- `OPEN_namespace(N) // namespace N {`
- `USING_namespace(N) // using namespace N`
- `CLOSE_namespace(N) // } // namespace N`

Uso de `"#include"`

El compilador C++ de Visual Studio .NET usa nombres de archivos de encabezado que no tienen el sufijo `".h"`. Por ejemplo, para usar un flujo de entrada, el programador debe incluir estas líneas:

- MSC++ v6 ====> `# include <iostream.h> // con `".h"``
- MSC++ .NET ==> `# include <iostream> // SIN `".h"``

Para incluir el archivo de encabezado correcto es necesario establecer cuál compilador se está usando. Para evitar usar varias directivas `# ifdef`, se puede definir una macro que indica cuál archivos de encabezado incluir. No todos los encabezados estándar están incorporados aquí, pero sí los más usados. Por ejemplo, para usar el archvio de encabadezdos `<iostream>` basta incluir en el código fuente la definición de este macro:

- ``#` define INCLUDE_iostream`

Diferencias entre MSC++ v6 y MSC++ .NET

Lo usual es encontrar código escrito para la versión vieja del compilador de Microsoft, el MSC++ v6.0 o anterior. Con frecuencia, basta hacer estas modificaciones para que el código pueda ser compilador con MSC++ .NET:

- Agregar el renglón `using namespace std;`
- Eliminar el `".h"` de los encabezados estándar [por ejemplo, cambiar <iostream.h> por <iostream>]
- En muchos casos, es necesario eliminar el `".h"` cuando se usan archivos de encabezado de la biblioteca estándar C [por ejemplo, cambiar <stdlib.h> por <cstdlib>]
- En otros casos, es necesario usar el nombre antiguo del archivo de encabezado [por ejemplo, sí sirve <math.h> pero no sirve <cmath>]

Borland C++ v3.1

En algunas ocasiones conviene más usar el compilador BC++ v3.1 porque es un compilador que requiere muy pocos recursos traducir programas.Desafortundamente, el BC++ v3.1 tiene varias restricciones de funcionamiento entre las que se destacan éstas:

- No tiene definido el tipo `"bool"`
- No permite usar `"namespace"`
- No permite usar excepciones
- No usa correctamente las reglas de conversi¢n de tipos

Algunos ejemplos C++ son sólo puedes ser expresado correctamente usando el lenguaje C++ moderno, est ndar. Pero muchos otros no requieren tanta expresividad por lo que pueden ser compilados con BC++ v3.1. Para lograrlo es necesario usar.

Ejemplo de uso

          #ifndef String_h
          #define String_h // Evita la inclusión múltiple

          #define  INCLUDE_iostream // ==> # include <iostream>
          #include "ADH_port.h"

          OPEN_namespace(ADH)
          USING_namespace(std); // es necesario agregar el punto y coma

          class String{
              // ...
          };

          CLOSE_namespace(ADH)

          USING_namespace(ADH); // es necesario agregar el ";"
          ADH::String& operator<<( std::ostream COUT&; ADH::String& s);

          #endif // String_h

Resultado en Borland C++ v3.1

          #ifndef String_h
          #define String_h // Evita la inclusión múltiple

          #include <iostream.h>
          #include "ADH_port.h"

          // namespace ADH {       //  ==> eliminado
          ; // using namespace std // ==> eliminado

          class String{
              // ...
          };

          // }  ==> eliminado

          // using namespace ADH;  // ==> eliminado  // ADH && std ==> eliminado
          ::String& operator<<( ::ostream COUT&; ::String& s);

          #endif // String_h

Resultado en Microsft C++ .NET

          #ifndef String_h
          #define String_h // Evita la inclusión múltiple

          #include <iostream> // sin ".h"
          #include "ADH_port.h"
          using namespace std; // Agregado en "ADH_port.h"

          namespace ADH {
          using namespace std;

          class String{
              // ...
          };

          } // namespace ADH

          using namespace ADH;
          ADH::String& operator<<( std::ostream COUT&; ADH::String& s);

          #endif // String_h

Author:
  Adolfo Di Mare <adolfo@di-mare.com>

Date:
  2005