В каком заголовочном файле библиотека boost определяет свой собственный тип данных? - PullRequest
2 голосов
/ 10 мая 2010

В последнее время я пытаюсь использовать двоичный синтаксический анализатор boost :: spirit :: qi для анализа некоторых двоичных данных в зависимости от порядка следования Платформы. Вот простой пример, подобный следующему:

Использование объявлений и переменных:

using boost::spirit::qi::little_word;
using boost::spirit::qi::little_dword;
using boost::spirit::qi::little_qword;

<strong>boost::uint16_t us;
boost::uint32_t ui;
boost::uint64_t ul;</strong>

Основное использование двоичных парсеров с прямым порядком байтов:

test_parser_attr("\x01\x02", little_word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", little_dword, ui); assert(ui == 0x04030201);
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul);
assert(ul == 0x0807060504030201LL);

test_parser("\x01\x02", little_word(0x0201));
test_parser("\x01\x02\x03\x04", little_dword(0x04030201));
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
    little_qword(0x0807060504030201LL));

Работает очень хорошо. Но у меня возникают вопросы: зачем нам здесь использовать некоторые типы данных, такие как boost::uint16_t, boost::uint32_t? Могу ли я использовать unsigned long или unsigned int здесь? И если я хочу проанализировать тип данных double или float, какой тип данных следует использовать? И, пожалуйста, скажите мне, где Boost определить выше эти типы?

Ответы [ 2 ]

6 голосов
/ 10 мая 2010

Существуют такие типы, как uint16_t или uint32_t, так что вы можете объявить переменную с определенной шириной в битах. Вы не можете сделать это с обычными типами, такими как «long», потому что они имеют разные размеры на разных архитектурах и / или реализациях. Вышеупомянутые типы обычно получаются путем вычислений препроцессора, приводящих к typedefs для конкретного типа реализации / архитектуры, чтобы получить этот конкретный размер.

3 голосов
/ 10 мая 2010

Файл <boost/cstdint.hpp> содержит все определения boost::(u)int(8|16|32|64)_t. Это обеспечивается главным образом потому, что MSVC не поставляется с <cstdint>. На компиляторах C ++, которые также являются компиляторами C (например, gcc), <boost/cstdint.hpp> просто импортирует <cstdint> в пространство имен boost.

см. Также: stdint.h

...