Quel fichier en-tête est où la bibliothèque Boost définir son propre type de données primitive?

StackOverflow https://stackoverflow.com/questions/2805215

  •  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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top