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

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

5 голосов
/ 25 апреля 2010

Реализация 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 ]

5 голосов
/ 25 апреля 2010

Я просто использую C99 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 голосов
/ 25 апреля 2010

Если вы включили файл напрямую, вам придется использовать префикс std ::. Поэтому вопрос в том, какой вариант вы бы выбрали в этом случае. Что бы вы сделали с другими типами, представленными Boost? Вы бы добавили к ним приставку boost :: or 1001 *

Первый - явно плохой вариант. Вы можете реализовать второй вариант, используя файл my_cstdint.hpp

#include <boost/cstdint.hpp>

using boost::uint32_t;
...

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

Даже если в третьем варианте используется много символов, для этого существуют пространства имен. boost :: uint32_t будет определен для правильного типа в зависимости от вашего набора инструментов, поэтому просто используйте его, как вы бы использовали std :: uint32_t.

2 голосов
/ 25 апреля 2010

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

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

1 голос
/ 25 апреля 2010

Лично я всегда использую вариант 3. Если что-то слишком длинное, вы можете использовать typedefs, чтобы уменьшить объем кода.

...