Quel fichier en-tête est où la bibliothèque Boost définir son propre type de données primitive?
-
25-09-2019 - |
Question
Récemment, j'essaie d'utiliser le boost :: esprit :: Parser endian binaire pour analyser qi certaines données binaires dépend de la boutisme de la plate-forme. Il y a un exemple simple, comme suit:
Utilisation des déclarations et des variables:
using boost::spirit::qi::little_word; using boost::spirit::qi::little_dword; using boost::spirit::qi::little_qword; boost::uint16_t us; boost::uint32_t ui; boost::uint64_t ul;
L'utilisation de base des petits parseurs binaires endian:
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));
Il fonctionne très bien. Mais mes questions viennent, pourquoi avons-nous besoin d'utiliser certains types de données comme boost::uint16_t
, boost::uint32_t
ici? Puis-je utiliser unsigned long
ou unsigned int
ici?
Et si je veux analyser le type de données double
ou float
, quel type de données boost dois-je utiliser? Et s'il vous plaît me dire où est poussée à définir ce qui précède ces types?
La solution
Les types comme uint16_t ou uint32_t existent pour que vous puissiez déclarer une variable pour avoir une largeur de bit spécifique. Vous ne pouvez pas le faire avec des types normaux comme « long » parce qu'ils sont de tailles différentes sur différentes architectures et / ou mises en œuvre. Les types précités sont normalement obtenus par l'aide de calculs de préprocesseur entraînant typedefs à la mise en œuvre / type spécifique d'architecture pour obtenir cette taille spécifique.
Autres conseils
Le <boost/cstdint.hpp>
de fichier contient toutes les définitions de boost::(u)int(8|16|32|64)_t
. Ceci est fourni principalement parce MSVC ne pas livré avec <cstdint>
. Sur les compilateurs C qui sont également de compilateurs C (comme gcc) <boost/cstdint.hpp>
importe simplement <cstdint>
dans l'espace de noms boost.
voir aussi: stdint.h