Boost's "cstdint" Использование
Реализация Boost в C99 stdint очень удобна. Одна вещь беспокоит меня, хотя. Они сбрасывают все свои typedef в boost namespace
, Это оставляет мне три варианта при использовании этого средства:
- Используйте "
using namespace boost
" - Используйте "
using boost::[u]<type><width>_t
" - Явно обратитесь к целевому типу с помощью
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, чтобы уменьшить объем кода.