Вопрос

Реализация Stdint Boost's C99 ужасно удобно. Одна вещь ошибка меня, хотя. Они бросают все свои типичные файлы в boost namespace. Отказ Это оставляет меня тремя вариантами при использовании этого объекта:

  1. Использовать "using namespace boost"
  2. Использовать "using boost::[u]<type><width>_t"
  3. Явно обратитесь к типу цели с boost:: приставка; например, boost::uint32_t foo = 0;

  • Вариант № 1 Вид поражения точка пространства имен. Даже если используется в местном объеме (например, в рамках функции), такие вещи, как аргументы функций, все еще должны быть префиксированы как опция № 3.
  • Вариант № 2 лучше, но есть куча этих типов, поэтому он может стать шумным.
  • Вариант № 3 добавляет крайний уровень шума; то boost:: префикс часто ≥ к длине рассматриваемого типа.

Мой вопрос: какой бы элегантный способ принести все эти типы в глобальное пространство имен? Должен ли я просто написать обертку вокруг boost/cstdint.hpp Это использует вариант № 2 и сделать с ним?


Кроме того, упаковывая заголовок, как так не работал на VC ++ 10 (проблемы со стандартными заголовками библиотеки):

namespace Foo
{
  #include <boost/cstdint.hpp>

  namespace boost_alias = boost;
}

using namespace Foo::boost_alias;

Редактировать: Я думаю, другой вариант - использовать препроцессор, чтобы сделать его работать на VC 10? Принимая фрагмент выше:

#ifndef FOO_HPP_INCLUDED
#define FOO_HPP_INCLUDED

#if _MSC_VER >= 1600 /*VC++ 10*/ || defined USE_NATIVE_STDINT_HEADER
  #include <stdint.h>
#else
  namespace cstdint_wrapper
  {
    #include <boost/cstdint.hpp>

    namespace boost_alias = boost;
  }

  using namespace cstdint_wrapper::boost_alias;
#endif

#endif

Меньше работы, я думаю?

Это было полезно?

Решение

Я просто использую C99's stdint.h (Это на самом деле сейчас в VS 2010). Для версий Visual C / C ++, которые не включают его, я использую версию публичной доведения от MingW, которую я модифицировал для работы с VC6 (от того, когда мне пришлось работать в VC6):

Есть пара других вариантов, которые вы можете рассмотреть в этом вопросе: C99 Stdint.h Заголовок и MS Visual Studio

Если вы хотите продолжить использование boost/cstdint.hpp, Я бы сказал, что предложение о внедрении заголовка обертки, который приносит типы в глобальное пространство имен, будет способ пойти.

Делает boost/cstdint.hpp предоставить что-нибудь, что я должен знать о том, что не в stdint.h?

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

Ваша идея написания заголовка обертки, который реализует вариант 2, безусловно, является лучшем из этих трех вариантов.

Однако я бы предложил, это небольшой вариант: положить те using Декларации в течение другого пространства имен, например, cstdint или что-то; Тогда у вас есть опция, если положить using cstdint; в вашем собственном коде или явно указании cstdint:: по конкретному применению.

Если вы включите непосредственно файл, вы будете вынуждены префиксировать его STD ::. Таким образом, вопрос в том, какой вариант вы бы взяли в этом случае. Что бы вы сделали с другими типами, представленными Boost? Вы бы префиксировали их с Boost :: или нет?

Кулак один явно плохой вариант. Вы можете реализовать опцию два, используя файл my_cstdint.hpp

#include <boost/cstdint.hpp>

using boost::uint32_t;
...

и включите my_cstdint.hpp в вашем приложении. Но, по моему мнению, это плохое представление о добавлении новых символов на корневом пространстве имен корневого пространства, вы можете получить больше конфликтов, поскольку типы могут быть уже определены, например, файлом stdint.h c.

Даже если третий вариант использует множество символов, пространства имен для этого для этой цели. BOOST :: UINT32_T будет определен правильному типу в зависимости от вашего набора инструментов, поэтому просто используйте его, так как вы будете использовать STD :: uint32_t.

Я лично всегда использую вариант 3. Если вещи слишком длинные, то вы можете использовать Typedefs, чтобы уменьшить количество кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top