En C ++, les entiers à largeur fixe sont définis comme facultatifs , mais je n'arrive pas à trouver la méthode recommandée pour vérifier s'ils sont réellement définis.
Quelle serait une façon portable de vérifier si des entiers à largeur fixe sont disponibles?
#if defined(INT8_MIN)
cpp
fichier défini et selon que la compilation échoue ou non, une macro que vous pouvez définir est définie.AC_TYPE_INT8_T
etc.Réponses:
Pour déterminer si un type entier à largeur fixe est fourni, vous pouvez vérifier si l'une des macros correspondantes
[U]INT*_MAX
ou[U]INT*_MIN
est définie.Par 7.20 types entiers
<stdint.h>
, paragraphe 4 de la norme C11 (notez les parties en gras):C ++ hérite de l'implémentation C via
<cstdint>
. Voir<cstdint>
vs<stdint.h>
pour quelques détails. Voir aussi Que font__STDC_LIMIT_MACROS
et__STDC_CONSTANT_MACROS
signifient? pour plus de détails__STDC_LIMIT_MACROS
.Ainsi, si
int32_t
est disponibleINT32_MAX
etINT32_MIN
doit être#define
'd. Inversement, s'ilint32_t
n'est pas disponible, niINT32_MAX
neINT32_MIN
peut l'être#define
.Notez cependant, comme @NicolBolas l'a indiqué dans une autre réponse , il n'est peut-être pas nécessaire de vérifier réellement.
la source
[U]INT*_C
place des macros min et maxINT64_C
est défini siint64_least_t
est disponible, pas siint64_t
est disponible. Reportez-vous à la documentationD'une manière générale ... vous ne le faites pas.
Si vous devez utiliser les types entiers de taille fixe, cela signifie que vous avez explicitement besoin que ces types soient de leurs tailles spécifiques. Autrement dit, votre code ne sera pas fonctionnel si vous ne pouvez pas obtenir d'entiers de ces tailles. Vous devez donc simplement les utiliser; si quelqu'un utilise votre code sur un compilateur qui n'a pas ces types, votre code ne sera pas compilé. Ce qui est bien, car votre code n'aurait pas fonctionné s'il avait été compilé.
Si vous n'avez pas réellement besoin d' entiers de taille fixe mais que vous les voulez simplement pour une autre raison, utilisez les
int_least_*
types. Si l'implémentation peut vous donner exactement cette taille, alors lesleast_*
types auront cette taille.la source
uint8_t
), mais ce code devait en quelque sorte s'exécuter sur une plate-forme où un octet n'est pas de 8 bits (qui, en plus d'utiliser un ancienne implémentation C ++, serait la seule raison pour laquelleuint8_t
ne serait pas disponible)? Autrement dit, en dehors de la compatibilité ascendante, pourquoi aviez-vous besoin de faire cela?uint8_t
était beaucoup plus clair que l’approche ad hoc (et souvent interrompue) antérieure.O(1)
contre l'O(n)
effort. Même raison pour laquelle les gens utilisent par exempleuint16_t
. Vous demandez "pourquoi ne pas utiliser uint32_t et le lancer vous-même?", Pour lequel la réponse devrait être évidente.uint16_t
. Ma raison est que je communique avec un périphérique / format / etc qui s'attend à obtenir précisément 16 bits de données formatées sous forme d'entier binaire non signé en utilisant l'endian pour ma machine, et si je ne peux pas obtenir un type qui est c'est précisément cela, alors communiquer efficacement avec elle est beaucoup plus difficile. Mon programme (et les API que j'utilise avec lui) ne peut fondamentalement pas fonctionner sur une machine qui ne fournit pas cela.