una regalos regalo pliegues para original modelos grandes forma envolver cuadro creativa con como colonia caja c++ boost namespaces

c++ - regalos - como envolver una colonia



¿Cómo puedo envolver BOOST en un espacio de nombres separado? (4)

@Josh: Aunque estoy de acuerdo con los escalofríos, sigo creyendo que este es el mejor curso de acción. De lo contrario, los problemas de vinculación son una certeza. He tenido la situación antes en la que tuve que hackear las bibliotecas compiladas usando objcopy para evitar conflictos de definición. Fue una pesadilla para las razones de interoperabilidad de la plataforma porque el cambio de nombre funciona de manera muy diferente incluso en versiones diferentes de los mismos compiladores (en mi caso, GCC).

Estoy buscando tener dos versiones de BOOST compiladas en un proyecto al mismo tiempo. Idealmente, deberían ser utilizables en esta línea:

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass(); boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);


Leo (bien escaneado) a través de la discusión de la lista de desarrollo . No hay una solución fácil. Para resumir:

  1. Envolver archivos de encabezado en una declaración de espacio de nombres

    namespace boost_1_36_0 { #include <boost_1_36_0/boost/regex.hpp> } namespace boost_1_35_0 { #include <boost_1_35_0/boost/shared_ptr.hpp> }

    • Requiere modificar los archivos fuente
    • No permite que se incluyan ambas versiones en la misma unidad de traducción, debido a que las macros no respetan los espacios de nombres.
  2. Definición de impulso antes de incluir encabezados

    #define boost boost_1_36_0 #include <boost_1_36_0/boost/regex.hpp> #undef boost #define boost boost_1_35_0 #include <boost_1_35_0/boost/shared_ptr.hpp> #undef boost

    • Los archivos de origen se pueden compilar simplemente con -Dboost=boost_1_36_0
    • Aún no aborda los conflictos de macro en una sola unidad de traducción.
    • Algunas inclusiones internas de archivos de encabezado pueden estar mal, ya que este tipo de cosas suceden.

      #if defined(SOME_CONDITION) # define HEADER <boost/some/header.hpp> #else # define HEADER <boost/some/other/header.hpp> #endif

      Pero puede ser bastante fácil solucionar estos casos.

  3. Modificar toda la biblioteca de impulso para reemplazar el namespace boost {..} con el namespace boost_1_36_0 {...} y luego proporcionar un alias del espacio de nombres. Reemplace todas BOOST_XYZ macros BOOST_XYZ y sus usos con macros BOOST_1_36_0_XYZ .
    • Esto probablemente funcionaría si estuvieras dispuesto a esforzarte.

Tendrá un mundo de problemas para vincularse porque los nombres destrozados serán diferentes. Y sí, veo que lo sabías, pero parece que va a haber problemas por todas partes.


El uso de bcp puede instalar la biblioteca de impulso en una ubicación específica y puede reemplazar todo el impulso de espacio de nombres en su código por un alias personalizado. Suponiendo que nuestro alias sea ''boost_1_36_0'', todos los bloques de código ''boost de espacio de nombres'' comenzarán con ''boost_1_36_0''. Algo como

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install

, pero consulte la documentación en el enlace usted mismo porque no estoy seguro de si es una sintaxis legal.