Dois-je utiliser des long long ou int64_t pour portable code?
J'ai un open-source code qui est écrit en C et en C++. Je suis à la recherche d'un type entier, qui est garanti pour être au moins 64 bits de large, qui peut être fiable compilé sur la plupart des OS X (Intel 64 bits) et Linux boîtes avec open-source compilateurs C et C++, sans trop de travail supplémentaire sur l'utilisateur final de la partie. Windows 32 bits et de soutien au client ne sont pas important à ce moment.
J'ai fait quelques tests sur OS X, et la dernière version de GCC qui est livré avec les outils de développement ne prend pas en charge C+11 mode (et ne semble donc pas vous garantir la disponibilité de long long
). Clang ne prend pas en charge ce, soit, si elle prend en charge long long
si C99 mode est activé, après une certaine version.
Est la suggestion générale à utiliser int64_t
en place de long long
, lorsque la portabilité est un objectif important? En utilisant les spécificateurs de format semble douloureux.
Puis-je de manière fiable jeté un int64_t
à long long
(et de même pour le unsigned
équivalent avec uint64_t
) pour l'utiliser avec les fonctions existantes et les bibliothèques qui prennent long long
comme paramètres? (Et d'en revenir, bien sûr.)
Dans cet état d'esprit, si j'envoie un code qui nécessite Clang fonctionnalités qui ne sont pas dans GCC, Clang est-ce qui va remplacer GCC comme compilateur de choix sur Linux? C'est que le compilateur quelque chose que je peux attendre, pour la plupart, en proposant le code source aux utilisateurs finaux?
En gros, j'aimerais demander l'avis d'autres développeurs qui ont utilisé les deux types de portable code C et C++, qui pourrait avoir des suggestions sur ce qui pourrait être le mieux à long terme du chemin à faire, compte tenu de l'objectif ci-dessus à l'esprit.
- gcc a eu
long long
comme une extension avant c++11, donc tant que vous ne désactivez pas l'gcc-extensions, vous devez être bien avec l'aide delong long
sur gcc (en Fait je ne pense pas que j'ai utilisé/vu un compilateur n'offrant pas de long pour une longue période). - Notez que
int64_t
peut avoir le type sous-jacentlong
oulong long
entre autres, ce qui peut causer des problèmes de portabilité si la surcharge est nécessaire. - Également envisager de typedef pour faciliter les changements de plate-forme à plate-forme.
- Une chose à considérer est que, en utilisant les surcharges ou les modèles avec
int64_t
pouvez sélectionner différentes versions sur différents systèmes. Voir cette autre question sur int64_t vs vs longue longue longue
Vous devez vous connecter pour publier un commentaire.
Les types
long long
etunsigned long long
sont de série C et C++ standard, avec au moins 64 bits. Tous les compilateurs, je suis conscient de fournir ces types, sauf peut-être quand dans un-pedantic
mode, mais dans ce casint64_t
ouuint64_t
ne sera pas disponible à la pré-C++ 2011 compilateurs, soit. Sur tous les systèmes<stdint.h>
est disponible, aussi. Qui est, autant que je peux dire il n'a pas d'importance combien vous épeler le type. L'objectif principal de<stdint.h>
est de fournir le meilleur match pour un certain nombre de bits. Si vous avez besoin d'au moins 64 bits, mais vous souhaitez aussi profiter de la jeun mise en œuvre de ce type, vous pouvez utiliserint_least64_t
ouuint_least64_t
de<stdint.h>
ou<cstdint>
(dans ce dernier cas, les noms sont définis dans l'espace de nomsstd
).long long long
?) même si je suis conscient que beaucoup de système de support de 128 bits types par SIMD support: Envoyer une proposition de WG14 et/ou WG21!long long long
n'est pas nécessaire; un système qui prend en charge 128 bits entiers pouvez définir étendue des types d'entiers et de définirint128_t
etuint128_t
en termes de ces types.int_fast64_t
etuint_fast64_t
sera mieuxJe serais très surpris si un compilateur offert
int64_t
mais paslong long
.Si
long long
est présent, il doit avoir au moins 64 bits, la conversion de(u)int64_t
à(unsigned) long long
est la préservation de la valeur.Si vous avez besoin d'un type avec exactement 64 bits, utilisez
(u)int64_t
, si vous avez besoin d' au moins 64 bits,(unsigned) long long
est parfaitement bien, comme ce serait(u)int_least64_t
.