Croix-plate-forme de types de données primitifs en C++
Contrairement à Java ou C#, les types de données primitifs en C++, la taille peut varier en fonction de la plate-forme. Par exemple, int
n'est pas garanti d'être un entier de 32 bits.
Divers compilateur environnements de définir des types de données tels que uint32
ou dword
à cette fin, mais il ne semble pas y avoir de norme d'inclure le fichier de taille fixe de types de données.
Quelle est la méthode recommandée pour obtenir un maximum de portabilité?
OriginalL'auteur Tony the Pony | 2009-09-06
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé cet en-tête particulièrement utile:
BOOST cstdint
Généralement mieux que d'inventer propre roue (qui effectue l'entretien et les tests).
OriginalL'auteur Anonymous
Créer un fichier d'en-tête appelé types.h, et de définir toutes les taille fixe de types primitifs dont vous avez besoin (int32 uint32, uint8, etc.). Pour prendre en charge plusieurs plates-formes, vous pouvez soit utiliser
#ifdef
's ou avoir un répertoire pour chaque plate-forme (include_x86, include_x86_64, include_sparc). Dans ce dernier cas, vous avez séparé construire des configurations pour chaque plate-forme, ce qui aurait le droit d'inclure le répertoire dans leur chemin. La seconde méthode est préférable, selon la "Le C++ Pièges" de Stephen Dewhurst.Juste un aparté, si vous prévoyez de passer des données binaires entre les différentes plates-formes, vous avez également à vous soucier de l'ordre des octets.
OriginalL'auteur Dima
Partie du standard C99 a été un stdint.h fichier d'en-tête à fournir ce type d'information. Par exemple, il définit un type appelé uint32_t. Malheureusement, beaucoup de compilateurs ne supportent pas stdint.h. Le meilleur de la croix-plate-forme de mise en œuvre 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 êtes à l'aide de boost, je crois qu'il fournit également quelque chose d'équivalent à la stdint en-tête.
OriginalL'auteur Brian
Définir un type (par exemple, int32) dans un fichier d'en-tête. Pour chaque plate-forme utiliser un autre #ifdef et assurez-vous que in32 est un entier de 32 bits. Partout dans votre code à utiliser int32 et assurez-vous que lorsque vous compilez sur les différentes plateformes, vous utilisez le bouton droit de définir
OriginalL'auteur
Deux choses:
Tout d'abord, il y a un fichier d'en-tête appelé limites.h qui donne beaucoup de plate-forme utile
des informations spécifiques. Il donnera les valeurs max et min pour le type int par exemple.
De cela, vous pouvez déduire comment big le type int est.
Vous pouvez également utiliser l'opérateur sizeof au moment de l'exécution, à ces fins, trop.
J'espère que cette aide . . .
K
OriginalL'auteur Karl T.
Il y a un stdint.h en-tête défini par le standard C99 et (je pense) une variante ou une autre de l'ISO C++. Ceci définit nice types comme int16_t, un uint64_t, etc... qui sont garantis d'avoir une taille spécifique et de la représentation. Malheureusement, c'est la disponibilité n'est pas exactement standard (Microsoft, en particulier, a un pied dragueur ici).
La réponse est simple, ce qui fonctionne sur toutes les 32 ou 64 bits des octets adressables de l'architecture, je suis conscient de:
Être conscients que certains de 32 bits compilateurs n'ont pas une version 64 bits de type à tous, donc à l'aide de longs va vous limiter à des systèmes 64 bits et un plus petit ensemble de compilateurs (qui comprend la gcc et MSVC, de sorte que la plupart des gens ne se soucient pas de ce problème).
int
64 bits sur certaines plates-formes.long long
est non-standard en C++ et est seulement garanti pour être égale ou plus grande taille quelong
.char
, à quelques rares systèmes, est de 16 bits. Ce ne sont pas des portables des hypothèses que vous avez faites. C'est la raison pour laquelle beaucoup de logiciels a de la difficulté lorsqu'ils sont portés à 64 bits à partir de Win32 et Linux-32.Ce type de réaction est pourquoi j'ai commencé avec le portable de réponse. Mais je suis désolé, votre pédanterie manque de preuves. Je suis au courant d'aucune plate-forme n'importe où qui définit int à 64 bits. "long long" est, en effet, non-standard. Pourtant, curieusement, il est beaucoup plus portable sur l'ensemble des compilateurs que n'importe quel standard 64 bits type; il est triste que les gens ne parviennent pas à le reconnaître. Le but est la portabilité, pas les normes. Ma réponse était sur le practiacal la portabilité des préoccupations.
OriginalL'auteur Andy Ross
Si son nom commence par deux caractères de soulignement (__), le type de données est non-standard.
__int8 (unsigned __int8)
__int16 (unsigned __int16)
__int32 (unsigned __int32)
__int64 (unsigned __int64)
Essayez d'utiliser boost/cstdint.php
OriginalL'auteur Ivan