Pourquoi autant de bibliothèques de définir leurs propres largeur fixe entiers?

0

La question

Au moins depuis C++11 nous avons beau fixe largeur des entiers par exemple en C++ <cstdint> ou C est <stdint.h> hors de la boîte, (par exemple std::uint32_t, std::int8_t), donc avec ou sans la std:: en face d'eux et de même que pour les macros, pour une largeur minimum (INT16_C, UINT32_C et ainsi de suite).

Pourtant, nous devons nous occuper avec les bibliothèques de tous les jours, qui définissent leurs propres largeur fixe entiers et vous pouvez le voir par exemple sf::Int32, quint32, boost::uint32_t, Ogre::uint32, ImS32, ... Je peux aller sur et sur, si vous voulez de moi. Vous aussi, vous connaissez un couple plus probablement.

Parfois, ces typedefs (souvent des définitions de macros) peuvent conduire à des conflits, par exemple lorsque vous souhaitez passer un std largeur fixe entier à une fonction à partir d'une bibliothèque attend à une largeur fixe entier avec exactement la même largeur, mais des sens différents.

Le point fixe d'une largeur de nombres entiers est d'avoir une taille fixe, qui est ce dont nous avons besoin dans de nombreuses situations, comme vous le savez. Alors pourquoi tous ces bibliothèques aller sur et typedef exactement les mêmes nombres entiers que nous avons déjà dans la norme C++? Ces extra définit sont parfois source de confusion, redondante et peut envahir votre base de code, qui sont de très mauvaises choses. Et si ils n'ont pas la largeur et de ce paramètre ils promettent d'avoir, au moins ils ont péché contre le principe de moindre étonnement, alors, quel est leur point par la présente, je vous le demande?

c++ fixed-width integer
2021-11-23 14:45:24
1

La meilleure réponse

5

Pourquoi autant de bibliothèques de définir leurs propres largeur fixe entiers?

Probablement pour certaines des raisons ci-dessous:

  • ils ont commencé avant le C++11 ou C11 (exemples: GTK, Qt, bibliothèques interne de GCC, Boost, FLTK, z gtkmm, Jsoncpp, Eigen, Dlib, OpenCV, Wt)

  • ils veulent avoir un code lisible, à l'intérieur de leur propre namespace ou class (le fait d'avoir leur propre espace de noms, comme Qt ne, peut améliorer la lisibilité du code bien écrit).

  • ils sont au moment de la construction configurable (par exemple, avec GNU autoconf).

  • ils veulent être compilable avec de vieux compilateurs C++ (par exemple, en C++03 un)

  • ils veulent être de la croix-compilable à bas prix embarqué microcontrôleurs dont le compilateur n'est pas un compilateur C++11.

  • ils peuvent avoir le code générique (ou template-s, par exemple dans Eigen ou Dlib) pour peut-être un soutien en précision arbitraire de l'arithmétique (ou bignums) peut-être en utilisant GMPlib.

  • ils veulent être en quelque sorte prouvable avec Frama-C ou DO-178C certifié (pour les systèmes embarqués critiques de logiciels de systèmes)

  • ils sont le processeur spécifique (par exemple, asmjit qui génère du code machine au moment de l'exécution sur un quelques architectures)

  • ils pourraient interface de matériel spécifique ou de langages de programmation (Tensorflow, OpenCL, Cuda).

  • ils veulent être utilisable à partir de Python ou GNU guile.

  • ils pourraient être spécifiques au système d'exploitation.

  • ils ajoutent supplémentaire de l'exécution des contrôles, par exemple, contre la division par 0 (ou autre comportement indéfini) ou de dépassement de capacité (que la norme C++ ne peut pas exiger, pour des performances ou des raisons historiques)

  • ils sont destinés à être facilement utilisable à partir de la machine généré par du code C++ (par exemple RefPerSys, ANTLR, ...)

  • ils sont conçus pour être appelée à partir de code C (par exemple libgccjit).

  • etc... la recherche d'autres bonnes raisons est laissé comme exercice au lecteur.

2021-11-24 08:35:11

Bon, vous gagnez. Je vais arrêter de rouler mes yeux chaque fois que j'en vois un.
nada

J'ai tellement de code correspondant au premier point, il n'est pas drôle.
user4581301

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................