Как я могу поместить BOOST в отдельное пространство имен?

Я хочу, чтобы две версии BOOST были скомпилированы в проект одновременно. В идеале они должны использоваться в следующих случаях:

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);

Мне любопытно, зачем вам это нужно.

Ferruccio 24.10.2008 05:24

Это было сделано для перехода на более новую версию библиотеки при устранении некоторых несовместимостей. Ничего постоянного.

Eclipse 26.10.2008 21:35

@Eclipse: если вы не раскрываете какие-либо типы Boost в своих интерфейсах, вы можете использовать атрибуты видимости ELF, скрывая все, что не является общедоступным интерфейсом.

wilx 19.07.2013 14:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
3
2 721
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

У вас возникнут проблемы со связыванием, потому что искаженные имена будут другими. И да, я вижу, вы это знали, но похоже, что вокруг будут проблемы.

Вот в чем дело. Я бы также обернул все исходные файлы регулярных выражений в каталог boostv1 с директивами пространства имен.

Eclipse 23.09.2008 22:26

@ Джош: Хотя я согласен с дрожью, я все же считаю, что это лучший курс действий. В противном случае связывание неприятностей - уверенность. Раньше у меня была ситуация, когда мне приходилось взламывать скомпилированные библиотеки с помощью objcopy, чтобы избежать конфликтов определений. Это был кошмар по причинам совместимости платформ, потому что изменение имен работает по-разному даже в разных версиях одних и тех же компиляторов (в моем случае - GCC).

Ответ принят как подходящий

Я читал (хорошо сканировал) через обсуждение списка развития. Нет простого решения. Подводить итоги:

  1. Обертывание файлов заголовков в объявлении пространства имен

    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>
    }
    
    • Требуется изменение исходных файлов
    • Не позволяет включать обе версии в одну единицу перевода из-за того, что макросы не учитывают пространства имен.
  2. Определение повышения до включения заголовков

    #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
    
    • Исходные файлы можно просто скомпилировать с помощью -Dboost=boost_1_36_0.
    • По-прежнему не решает конфликты макросов в одной единице перевода.
    • Некоторые включения файла внутреннего заголовка могут быть испорчены, поскольку подобные вещи действительно случаются.

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

      Но эти случаи может быть достаточно легко обойти.

  3. Изменение всей библиотеки boost для замены namespace boost {..} на namespace boost_1_36_0 {...} с последующим предоставлением псевдонима пространства имен. Замените все макросы BOOST_XYZ и их использование макросами BOOST_1_36_0_XYZ.
    • Скорее всего, это сработает, если вы захотите приложить усилия.

Если вы собираетесь изменить заголовки, вы можете избежать конфликтов макросов с помощью чего-то вроде 's / BOOST_ / BOOST_1_36_0_ / g'. Может быть.

Daniel James 23.09.2008 23:58

Использование bcp позволяет установить библиотеку Boost в определенное место и заменить все «ускорение пространства имен» в их коде на настраиваемый псевдоним. Предполагая, что наш псевдоним «boost_1_36_0», все блоки кода «namespace boost» будут начинаться с «boost_1_36_0». Что-то типа

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

, но проверьте документацию по ссылке самостоятельно, потому что я не уверен, является ли это допустимым синтаксисом.

Другие вопросы по теме