web-dev-qa-db-fra.com

Pourquoi tout le monde tape-t-il sur les types C standard?

Si vous voulez utiliser Qt , vous devez embrasser quint8, quint16 et ainsi de suite.

Si vous souhaitez utiliser GLib, vous devez accueillir guint8, guint16 et ainsi de suite.

Sur Linux il y 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 choses, vous feriez mieux de vous préparer aux ennuis. Parce que sur votre machine u32 sera typedefd sur long et quint32 sera typedefd sur int et le compilateur se plaindra.

Pourquoi tout le monde fait ça, s'il y a <stdint.h>? Est-ce une sorte de tradition pour les bibliothèques?

103
Amomum

stdint.h n'existait pas lors du développement de ces bibliothèques. Ainsi, chaque bibliothèque a créé ses propres typedefs.

80
Edward Karak

Pour les anciennes bibliothèques, cela est nécessaire car l'en-tête en question (stdint.h) n'existait pas.

Il y a cependant toujours un problème: ces types (uint64_t et autres) sont ne fonctionnalité optionnelle dans la norme. Une implémentation conforme peut donc ne pas être livrée avec eux - et forcer ainsi les bibliothèques à les inclure de nos jours.

40
Ven

stdint.h a été normalisé depuis 1999. Il est plus probable que de nombreuses applications définissent (en fait des alias) des types pour maintenir une indépendance partielle par rapport à l'architecture de la machine sous-jacente.

Ils donnent aux développeurs la certitude que les types utilisés dans leur application correspondent aux hypothèses spécifiques à leur projet sur le comportement qui peut ne pas correspondre à la norme de langage ou à l'implémentation du compilateur.

La pratique se reflète dans le modèle de conception orienté objet Façade et est très utilisée de manière abusive par les développeurs qui écrivent invariablement des classes wrapper pour toutes les bibliothèques importées.

Lorsque les compliants étaient beaucoup moins standard et que les architectures des machines pouvaient varier de 16 bits, 18 bits à 6 bits mainframes de longueur de mot, cela était beaucoup plus à prendre en compte. La pratique est beaucoup moins pertinente maintenant dans un monde convergeant sur des systèmes embarqués 32 bits ARM. Elle reste une préoccupation pour les microcontrôleurs bas de gamme avec impair cartes mémoire.

13
Pekka

Vous avez donc le pouvoir de taper le caractère en int.

Un "horreur de codage" a mentionné qu'un en-tête d'entreprise avait un point où un programmeur voulait une valeur booléenne, et un caractère était le type natif logique pour le travail, et a donc écrit typedef bool char. Plus tard, quelqu'un a trouvé un entier comme le choix le plus logique et a écrit typedef bool int. Le résultat, bien avant Unicode, était pratiquement typedef char int.

Beaucoup de réflexion avant-gardiste, de compatibilité ascendante, je pense.

4
Christos Hayward