Boost's "cstdint" Использование

Реализация Boost в C99 stdint очень удобна. Одна вещь беспокоит меня, хотя. Они сбрасывают все свои typedef в 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

Меньше работы, наверное?

4 ответа

Решение

Я просто использую С99 stdint.h (это на самом деле сейчас в VS 2010). Для тех версий Visual C/C++, которые его не включают, я использую общедоступную версию MinGW, которую я изменил для работы с VC6 (с тех пор, как мне пришлось работать в VC6):

В этом вопросе SO вы можете рассмотреть еще несколько вариантов: заголовок 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, чтобы уменьшить объем кода.

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