Si vous souhaitez utiliser Qt , vous devez accepter quint8
, quint16
et ainsi de suite.
Si vous souhaitez utiliser GLib , vous devez accueillir guint8
, guint16
et ainsi de suite.
Sur Linux, il y en a u32
, s16
et ainsi de suite.
uC / OS définit SINT32
, UINT16
et ainsi de suite.
Et si vous devez utiliser une combinaison de ces éléments, vous feriez mieux de vous préparer aux ennuis. Parce que sur votre machine u32
sera typedef
terminé long
et quint32
sera typedef
terminé int
et le compilateur se plaindra .
Pourquoi tout le monde fait-il cela, s'il y en a <stdint.h>
? S'agit-il d'une sorte de tradition pour les bibliothèques?
stdint.h
été inventé.sizeof(int) * CHAR_BIT
(par exemple) et utiliser cela? Si votreint
est trop petit pour représenter votre plage (par exemple un index de tableau), alors vous ne devriez certainement pas utiliser deint
toute façon, mais quelque chose commesize_t
. Pourquoi aurait-ilint32
plus de sens? Le seul moment où la largeur fixe a du sens est pour la communication entre les systèmes (par exemple, format de fichier / réseau) ...uint16_t
(ou peut-être safast
ou saleast
variante). Mon point étant: ces types sont pratiques à utiliser et ont leur raison d'être.size_t
et / ouuint64_t
.Réponses:
stdint.h
n'existait pas à l'époque où ces bibliothèques étaient en cours de développement. Chaque bibliothèque a donc créé ses proprestypedef
s.la source
Pour les bibliothèques plus anciennes, cela est nécessaire car l'en-tête en question (
stdint.h
) n'existait pas.Cependant, il existe toujours un problème: ces types (
uint64_t
et d'autres) sont une fonctionnalité facultative de la norme. Ainsi, une implémentation conforme pourrait ne pas être livrée avec eux - et obliger ainsi les bibliothèques à les inclure encore de nos jours.la source
uintN_t
types sont facultatifs, mais les typesuint_leastN_t
etuint_fastN_t
ne le sont pas.stdint.h
est normalisé depuis 1999. Il est plus probable que de nombreuses applications définissent des types (en fait des alias) pour conserver une indépendance partielle par rapport à l'architecture de la machine sous-jacente.Ils donnent aux développeurs l'assurance que les types utilisés dans leur application correspondent aux hypothèses spécifiques de leur projet sur le comportement qui peut ne pas correspondre à la norme de langage ou à l'implémentation du compilateur.
La pratique est reflétée dans le modèle de conception de Façade orienté objet et est beaucoup abusée par les développeurs qui écrivent invariablement des classes wrapper pour toutes les bibliothèques importées.
Lorsque les conformes étaient beaucoup moins standard et que les architectures de machine pouvaient varier de 16 bits, 18 bits à 36 bits de longueur de mot, c'était beaucoup plus une considération. La pratique est beaucoup moins pertinente maintenant dans un monde convergeant vers les systèmes embarqués ARM 32 bits. Cela reste une préoccupation pour les microcontrôleurs bas de gamme avec des cartes mémoire impaires .
la source
stdint.h
est normalisé depuis 1999, mais depuis combien de temps est-il disponible dans la pratique? Les gens traînent les pieds pour mettre en œuvre et adopter de nouvelles normes, et pendant cette longue période de transition, les anciennes méthodes sont toujours indispensables.stdint.h
est que même sur les plates-formes où, par exemple,long
etint32_t
ont la même taille et la même représentation, il n'est pas nécessaire que le cast d'unint32_t*
tolong*
produise un pointeur qui peut accéder de manière fiable à un fichierint32_t
. Je ne peux pas croire que les auteurs du Standard aient pensé qu'il était évident que les types compatibles avec la mise en page devraient être compatibles avec les alias, mais comme ils n'ont pas pris la peine de le dire, les auteurs de gcc et IIRC clang pensent que le langage serait amélioré en ignorant même l'aliasing. dans les cas où c'est évident.-fno-strict-alias
, mais qui fonctionnerait toujours. Même s'il n'y avait pas de base de code existante, aucun ensemble de règles ne pourrait trouver l'équilibre optimal entre l'optimisation et la sémantique pour toutes les applications, car différentes applications ont des besoins différents. Ajoutez la base de code existante et la nécessité de différents modes devrait être claire.Vous avez donc le pouvoir de typedef char to int.
Une "horreur du codage" a mentionné qu'un en-tête de société avait un point où un programmeur voulait une valeur booléenne, et un char était le type natif logique pour le travail, et ainsi de suite
typedef bool char
. Puis, plus tard, quelqu'un a trouvé qu'un entier était le choix le plus logique et a écrittypedef bool int
. Le résultat, bien avant Unicode, était virtuellementtypedef char int
.Beaucoup de compatibilité avant-gardiste et prospective, je pense.
la source