ADH_port.h

Ir a la documentación de este archivo.
00001 // ADH_port.h (c) 2005 adolfo@di-mare.com
00002 
00003 /** \file  ADH_port.h
00004     \brief Encabezado para que los programas puedan ser compilados
00005            con varios compiladores
00006 
00007     Este archivo de encabezado permite compilar los programas de
00008     \c adolfo@di-mare.com usando cualquiera de estos compiladores:
00009     - Microsoft C++ .NET
00010     - Microsoft C++ v6
00011     - Borland C++ v3.1
00012 
00013     \par Uso de \c "namespace"
00014 
00015     Para permitir que el código sea compilador con el Borland C++ v3.1, que no
00016     permite usar \c "namespace", los programas están escritos usando estas
00017     macros, que sirven para iniciar, usar y terminar un \c "namespace":
00018     - <code>OPEN_namespace(N) // namespace N { </code>
00019     - <code>USING_namespace(N) // using namespace N </code>
00020     - <code>CLOSE_namespace(N)  // } // namespace N </code>
00021 
00022     \par Omitir las definiciones de \c "namespace"
00023 
00024     Si por alguna razón conviene omitir todas las definiciones de \c "namespace"
00025     basta declarar la macro \c NO_namespace antes de incluir este archivo de
00026     encabezado:
00027     - <code> #define  NO_namespace </code>
00028     - <code> #include &lt;ADH_port.h&gt; </code>
00029 
00030     El efecto de usar \c NO_namespace es que, efectivamente, las 3 macros
00031     quedarían definidas así:
00032     - <code>OPEN_namespace(N)  // no abre namespace N </code>
00033     - <code>USING_namespace(N  // no usa namespace N </code>
00034     - <code>CLOSE_namespace(N) // no cierra namespace N </code>
00035 
00036     \par Uso de \c "#include"
00037 
00038     El compilador C++ de Visual Studio .NET usa nombres de archivos de
00039     encabezado que no tienen el sufijo \c ".h". Por ejemplo, para
00040     usar un flujo de entrada, el programador debe incluir estas líneas:
00041     - MSC++ v6 ====> <code> # include &lt;iostream.h&gt; // con \c ".h" </code>
00042     - MSC++ .NET ==> <code> # include &lt;iostream&gt; // SIN \c ".h" </code>
00043 
00044     Para incluir el archivo de encabezado correcto es necesario establecer cuál
00045     compilador se está usando. Para evitar usar varias directivas <code> #&nbsp;ifdef</code>, se
00046     puede definir una macro que indica cuál archivos de encabezado incluir. No todos los
00047     encabezados estándar están incorporados aquí, pero sí los más usados. Por ejemplo, para
00048     usar el archvio de encabadezdos \c &lt;iostream&gt; basta incluir en el código fuente la
00049     definición de este macro:
00050     - <code> \c # define  INCLUDE_iostream </code>
00051 
00052     \par Diferencias entre MSC++ v6 y MSC++ .NET
00053 
00054     Lo usual es encontrar código escrito para la versión vieja del compilador de Microsoft,
00055     el MSC++ v6.0 o anterior. Con frecuencia, basta hacer estas modificaciones para que
00056     el código pueda ser compilador con MSC++ .NET:
00057 
00058     - Agregar el renglón <code> using namespace std; </code> <br>
00059     - Eliminar el \c ".h" de los encabezados estándar
00060        [por ejemplo, cambiar &lt;iostream.h&gt; por &lt;iostream&gt;]
00061     - En muchos casos, es necesario eliminar el \c ".h" cuando se usan archivos de
00062       encabezado de la biblioteca estándar C
00063        [por ejemplo, cambiar &lt;stdlib.h&gt; por &lt;cstdlib&gt;]
00064     - En otros casos, es necesario usar el nombre antiguo del archivo de encabezado
00065        [por ejemplo, sí sirve &lt;math.h&gt; pero no sirve &lt;cmath&gt;]
00066 
00067     \par Borland C++ v3.1
00068 
00069     En algunas ocasiones conviene más usar el compilador BC++ v3.1 porque es un
00070     compilador que requiere muy pocos recursos traducir programas.Desafortundamente,
00071     el  BC++ v3.1 tiene varias restricciones de funcionamiento entre las que se
00072     destacan éstas:
00073 
00074     - No tiene definido el tipo \c "bool"
00075     - No permite usar \c "namespace"
00076     - No permite usar excepciones
00077     - No usa correctamente las reglas de conversi¢n de tipos
00078 
00079     Algunos ejemplos C++ son sólo puedes ser expresado correctamente
00080     usando el lenguaje C++ moderno, est ndar. Pero muchos otros no
00081     requieren tanta expresividad por lo que pueden ser compilados con
00082     BC++ v3.1. Para lograrlo es necesario usar.
00083 
00084     \par Ejemplo de uso
00085     \code
00086     #ifndef String_h
00087     #define String_h // Evita la inclusión múltiple
00088 
00089     #define  INCLUDE_iostream // ==> # include <iostream>
00090     #include "ADH_port.h"
00091 
00092     OPEN_namespace(ADH)
00093     USING_namespace(std); // es necesario agregar el punto y coma
00094 
00095     class String{
00096         // ...
00097     };
00098 
00099     CLOSE_namespace(ADH)
00100 
00101     USING_namespace(ADH); // es necesario agregar el ";"
00102     ADH::String& operator<<( std::ostream COUT&; ADH::String& s);
00103 
00104     #endif // String_h
00105     \endcode
00106 
00107     \par Resultado en Borland C++ v3.1
00108     \code
00109     #ifndef String_h
00110     #define String_h // Evita la inclusión múltiple
00111 
00112     #include <iostream.h>
00113     #include "ADH_port.h"
00114 
00115     // namespace ADH {       //  ==> eliminado
00116     ; // using namespace std // ==> eliminado
00117 
00118     class String{
00119         // ...
00120     };
00121 
00122     // }  ==> eliminado
00123 
00124     // using namespace ADH;  // ==> eliminado  // ADH && std ==> eliminado
00125     ::String& operator<<( ::ostream COUT&; ::String& s);
00126 
00127     #endif // String_h
00128     \endcode
00129 
00130     \par Resultado en Microsft C++ .NET
00131     \code
00132     #ifndef String_h
00133     #define String_h // Evita la inclusión múltiple
00134 
00135     #include <iostream> // sin ".h"
00136     #include "ADH_port.h"
00137     using namespace std; // Agregado en "ADH_port.h"
00138 
00139     namespace ADH {
00140     using namespace std;
00141 
00142     class String{
00143         // ...
00144     };
00145 
00146     } // namespace ADH
00147 
00148     using namespace ADH;
00149     ADH::String& operator<<( std::ostream COUT&; ADH::String& s);
00150 
00151     #endif // String_h
00152     \endcode
00153 
00154     \author Adolfo Di Mare <adolfo@di-mare.com>
00155     \date   2005
00156 */
00157 
00158 #ifndef ADH_port_h
00159 #define ADH_port_h ///< Evita la inclusión múltiple
00160 
00161 // Documentados acá para Doxygen
00162 #undef  CLOSE_namespace
00163 #undef  USING_namespace
00164 #undef  OPEN_namespace
00165 
00166 /// Abre namespace   \c "N"
00167 #define OPEN_namespace(N) namespace N {
00168 
00169 /// Cierra namespace \c "N"
00170 #define CLOSE_namespace(N) }
00171 
00172 /// Usa namespace    \c "N"
00173 #define USING_namespace(N) using namespace N
00174 
00175 // Los anula para luego definirlos dentro del #ifdef correcto
00176 #undef  CLOSE_namespace
00177 #undef  USING_namespace
00178 #undef  OPEN_namespace
00179 
00180 #ifdef DOXYGEN_COMMENT   // Documentados acá para Doxygen
00181     /// Definido por la biblioteca C++ estándar
00182     namespace std {} // Está acá para que Doxygen lo documente
00183     /// ADH son las siglas de \c adolfo@di-mare.com
00184     namespace ADH {} // Está acá para que Doxygen lo documente
00185     #define INCLUDE_fstream   Truco para "#include <fstream>"   portable
00186     #define INCLUDE_iomanip   Truco para "#include <iomanip>"   portable
00187     #define INCLUDE_iostream  Truco para "#include <iostream>"  portable
00188     #define INCLUDE_list      Truco para "#include <list>"      portable
00189     #define INCLUDE_map       Truco para "#include <map>"       portable
00190     #define INCLUDE_stdexcept Truco para "#include <stdexcept>" portable
00191     #define INCLUDE_vector    Truco para "#include <vector>"    portable
00192 #endif
00193 
00194 // Borland C++
00195 #ifdef __BORLANDC__               ///< Definida para Borland C++
00196     #if (__BORLANDC__ <= 0x0410)  //   Identifica a BC++ v3.1 y anterior
00197 
00198         // Declara el tipo "bool" porque BC++ v3.1 NO tiene "bool"
00199         #ifndef _bool_h
00200         #define _bool_h
00201             #undef false
00202             #undef true
00203             #undef bool
00204 
00205             typedef int bool;
00206             const int false = 0;
00207             const int true  = ! false; // BC++ v3.1 NO tiene "bool"
00208         #endif
00209 
00210         class istream; class ostream;
00211 
00212         #define using              // BC++ v3.1 NO tiene "namespace"
00213         #define namespace
00214         #define std
00215         #define ADH
00216 
00217         #define OPEN_namespace(N)  // BC++ v3.1 NO tiene "namespace"
00218         #define CLOSE_namespace(N)
00219         #define USING_namespace(N)
00220 
00221         #ifdef INCLUDE_fstream
00222             #include  <fstream.h>
00223         #endif
00224         #ifdef INCLUDE_iomanip
00225             #include  <iomanip.h>
00226         #endif
00227         #ifdef INCLUDE_iostream
00228             #include  <iostream.h>
00229         #endif
00230         #ifdef INCLUDE_list
00231             #include  <list.h>
00232         #endif
00233         #ifdef INCLUDE_map
00234             #include  <map.h>
00235         #endif
00236         #ifdef INCLUDE_set
00237             #include  <set.h>
00238         #endif
00239         #ifdef INCLUDE_stdexcept
00240             #include  <stdexcept.h>
00241         #endif
00242         #ifdef INCLUDE_string
00243             #include  <string.h>
00244         #endif
00245         #ifdef INCLUDE_vector
00246             #include  <vector.h>
00247         #endif
00248     #endif
00249 
00250     #if (__BORLANDC__ >  0x0410)  // Versiones posteriores a BC++ v3.1
00251         #define OPEN_namespace(N) namespace N {
00252         #define CLOSE_namespace(N) }
00253         #define USING_namespace(N) using namespace N
00254         #error Ajuste ADH_port.h para compìlar con versiones nuevas de BC++
00255     #endif
00256 #endif
00257 
00258 // Microsoft C++ (Visual Studio)
00259 #ifdef _MSC_VER                   ///< Definida para Micrsoft C++
00260     // namespace
00261     #define OPEN_namespace(N) namespace N {
00262     #define CLOSE_namespace(N) }
00263     #define USING_namespace(N) using namespace N
00264 
00265     #if (_MSC_VER >= 1300)        //   Identifica a VC++ .net
00266         /// Definido por la biblioteca C++ estándar
00267         namespace std {} // Está acá para que Doxygen lo documente
00268         // using namespace std;
00269 
00270         #ifdef INCLUDE_fstream
00271             #include  <fstream>
00272         #endif
00273         #ifdef INCLUDE_iomanip
00274             #include  <iomanip>
00275         #endif
00276         #ifdef INCLUDE_iostream
00277             #include  <iostream>
00278         #endif
00279         #ifdef INCLUDE_list
00280             #include  <list>
00281         #endif
00282         #ifdef INCLUDE_map
00283             #include  <map>
00284         #endif
00285         #ifdef INCLUDE_set
00286             #include  <set>
00287         #endif
00288         #ifdef INCLUDE_stdexcept
00289             #include  <stdexcept>
00290         #endif
00291         #ifdef INCLUDE_string
00292             #include  <string>
00293         #endif
00294         #ifdef INCLUDE_vector
00295             #include  <vector>
00296         #endif
00297     #endif
00298 
00299     #if (_MSC_VER < 1300)         //   Identifica a VC++ v6 y anterior
00300         namespace std {} // Está acá para que Doxygen lo documente
00301         // using namespace std;
00302         // Antes de MSC++ .NET hay que usar <.h>
00303         #ifdef INCLUDE_fstream
00304             #include  <fstream.h>
00305         #endif
00306         #ifdef INCLUDE_iomanip
00307             #include  <iomanip.h>
00308         #endif
00309         #ifdef INCLUDE_iostream
00310             #include  <iostream.h>
00311         #endif
00312         #ifdef INCLUDE_list
00313             #include  <list.h>
00314         #endif
00315         #ifdef INCLUDE_map
00316             #include  <map.h>
00317         #endif
00318         #ifdef INCLUDE_set
00319             #include  <set.h>
00320         #endif
00321         #ifdef INCLUDE_stdexcept
00322             #include  <stdexcept.h>
00323         #endif
00324         #ifdef INCLUDE_string
00325             #include  <string.h>
00326         #endif
00327         #ifdef INCLUDE_vector
00328             #include  <vector.h>
00329         #endif
00330     #endif
00331 #endif
00332 
00333 #ifdef __GNUC__                   ///< Definida para GNU C++
00334     // namespace
00335     #define OPEN_namespace(N) namespace N {
00336     #define CLOSE_namespace(N) }
00337     #define USING_namespace(N) using namespace N
00338 
00339     namespace std {} // Está acá para que Doxygen lo documente
00340     // using namespace std;
00341 
00342     #ifdef INCLUDE_fstream
00343         #include  <fstream>
00344     #endif
00345     #ifdef INCLUDE_iomanip
00346         #include  <iomanip>
00347     #endif
00348     #ifdef INCLUDE_iostream
00349         #include  <iostream>
00350     #endif
00351     #ifdef INCLUDE_list
00352         #include  <list>
00353     #endif
00354     #ifdef INCLUDE_map
00355         #include  <map>
00356     #endif
00357     #ifdef INCLUDE_set
00358         #include  <set>
00359     #endif
00360     #ifdef INCLUDE_stdexcept
00361         #include  <stdexcept>
00362     #endif
00363     #ifdef INCLUDE_string
00364         #include  <string>
00365     #endif
00366     #ifdef INCLUDE_vector
00367         #include  <vector>
00368     #endif
00369 #endif
00370 
00371 #ifdef NO_namespace ///< Omita las definiciones de \c "namespace"
00372     #undef  CLOSE_namespace
00373     #undef  USING_namespace
00374     #undef  OPEN_namespace
00375 
00376     #define CLOSE_namespace(N)  // no cierra namespace N
00377     #define USING_namespace(N)  // no usa namespace N
00378     #define OPEN_namespace(N)   // no abre namespace N
00379 #endif
00380 
00381 #endif // ADH_port_h
00382 
00383 // EOF: ADH_port.h

Generado el Wed Apr 9 13:16:23 2008 para Prueba de la clase rational: por  doxygen 1.5.4