Question

Contrairement à Java ou C #, types de données primitives en C ++ peuvent varier en taille en fonction de la plate-forme. Par exemple, int n'est pas garanti d'être un entier de 32 bits. Divers environnements de compilateur définissent des types de données tels que uint32 ou dword à cet effet, mais il semble y avoir aucune norme inclure le fichier pour les types de données de taille fixe.

Quelle est la méthode recommandée pour obtenir un maximum de portabilité?

Était-ce utile?

La solution

Je trouve cet en-tête particulièrement utile: BOOST cstdint

En général, mieux que d'inventer la roue propre (qui engage l'entretien et les tests).

Autres conseils

Créez un fichier d'en-tête appelé types.h et définir tous les types primitifs de taille fixe dont vous avez besoin (int32, uint32, uint8, etc.). Pour prendre en charge plusieurs plates-formes, vous pouvez utiliser des années #ifdef ou un répertoire comprennent séparé pour chaque plate-forme (include_x86, include_x86_64, include_sparc). Dans ce dernier cas, vous auriez des configurations de construction distinctes pour chaque plate-forme, ce qui aurait le droit d'inclure le répertoire dans leur chemin d'inclusion. La seconde méthode est préférable, d'après les "C ++ Gotchas" par Stephen Dewhurst.

Juste un aparté, si vous prévoyez de transmettre des données binaires entre les différentes plates-formes, vous avez également à vous soucier de l'ordre des octets.

Une partie de la norme C99 est un fichier d'en-tête stdint.h pour fournir ce genre d'information. Par exemple, il définit un type appelé uint32_t. Malheureusement, beaucoup de compilateurs ne supportent pas stdint.h. La meilleure mise en œuvre multi-plateforme que j'ai vu de stdint.h est ici: http: // www. azillionmonkeys.com/qed/pstdint.h . Vous pouvez simplement inclure dans votre projet.

Si vous utilisez coup de pouce, je crois qu'il fournit également quelque chose d'équivalent à l'en-tête de stdint.

définir un type (par exemple int32) dans un fichier d'en-tête. Pour chaque plate-forme utiliser une autre #ifdef et assurez-vous que IN32 est un entier de 32 bits. Partout dans vos int32 d'utilisation de code et assurez-vous que lorsque vous compilez sur différentes plates-formes que vous utilisez le droit de définir

Deux choses:

Tout d'abord, il y a un fichier d'en-tête appelé limits.h qui donne beaucoup de plate-forme utile information spécifique. Il donnera des valeurs maximum et minimum pour le type int par exemple. De là, vous pouvez déduire la taille du type int est.

Vous pouvez également utiliser l'opérateur sizeof lors de l'exécution à ces fins aussi.

J'espère que cela aide. . .

K

Si son nom commence par deux traits de soulignement (__), un type de données est non standard.

__ int8 (__int8 unsigned)

__ int16 (__int16 unsigned)

__ int32 (__int32 unsigned)

__ int64 (__int64 unsigned)

Essayez d'utiliser boost / cstdint.hpp

Il y a un en-tête de stdint.h défini par la norme C99 et (je pense) une variante ou d'une autre de l'ISO C ++. Cela définit comme de beaux types int16_t, uint64_t, etc ... qui sont garantis d'avoir une taille spécifique et de représentation. Malheureusement, sa disponibilité est pas exactement standard (Microsoft en particulier était un dragueur à pied ici).

La réponse est simple, qui fonctionne sur tous les 32 ou 64 bits architecture octet adressable Je suis conscient de:

  • Toutes les variables char sont 1 octet
  • Toutes les variables sont courtes 2 octets
  • Toutes les variables int sont 4 octets
  • Ne pas utiliser un "long", qui est de taille indéterminée.
  • Tous les compilateurs connus avec prise en charge en tant que type 64 bits natif 64 bits mathématiques permettent « long long ».

Sachez que certains 32 compilateurs bits ne sont pas de type 64 bits du tout, donc l'utilisation à long temps vous limiter à les systèmes 64 bits et un plus petit ensemble de compilateurs (qui comprend gcc et MSVC, de sorte que la plupart des gens ont gagné » soins à propos de ce problème).

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