“cstdint” использование повышения

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

Меньше работы, я предполагаю?

5
задан alain.janinm 1 May 2012 в 09:54
поделиться

4 ответа

Я просто использую 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 ?

5
ответ дан 13 December 2019 в 22:04
поделиться

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

1
ответ дан 13 December 2019 в 22:04
поделиться

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

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

2
ответ дан 13 December 2019 в 22:04
поделиться

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

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

#include <boost/cstdint.hpp>

using boost::uint32_t;
...

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

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

2
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: