Реализация C99 stdint повышения ужасно удобна. Одна вещь прослушивает меня, все же. Они выводят все свои определения типов в boost namespace
. Это оставляет меня с тремя вариантами при использовании этого средства:
using namespace boost
"using boost::[u]<type><width>_t
"boost::
префикс; например, boost::uint32_t foo = 0;
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 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
?
Лично я всегда использую вариант 3. Если что-то слишком длинное, вы можете использовать typedef, чтобы уменьшить объем кода.
Ваша идея написать заголовок оболочки, реализующий вариант 2, определенно лучше из этих трех вариантов.
Я бы предложил лишь небольшой вариант: поместите те с использованием
объявлений в другое пространство имен, например cstdint
или что-то в этом роде; тогда у вас есть возможность поместить с помощью cstdint;
в свой собственный код или явно указать cstdint ::
для конкретных целей.
Если вы включили файл напрямую, вы будете вынуждены добавить к нему префикс 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.