2016-10-13 1 views
0

J'utilise un grand package de physique, Geant4, pour effectuer des simulations. Un certain nombre de typedefs sont définis dans le langage et utilisés exclusivement dans le package.Typedef de types numériques

typedef double G4double; 
typedef float G4float; 
typedef int G4int; 
typedef bool G4bool; 
typedef long G4long; 

Je comprends l'utilisation de typedefs pour exposer les types numériques comme types spécifiques au domaine, car cela améliore la lisibilité et permet à l'typedef à modifier ultérieurement, si nécessaire. Dans ce cas, cependant, les typedefs sont si larges qu'ils ne servent pas ce but.

J'ai également entendu parler de typedefs sont utilisés pour assurer une bitsize cohérente de chaque type, sizeof(int) n'est pas garantie par la norme. Cela ne peut pas être dans ce cas, car ces typedefs sont toujours présents, plutôt que d'être générés par un script après avoir vérifié la taille du type en question.

Quels sont les autres buts que je pourrais manquer?

Répondre

0

Certaines bibliothèques aiment faire cela pour maintenir la cohérence dans leur code. Tous les types qu'ils utilisent (même les primitives) commencent par G4.

En théorie, vous pouvez les redéfinir sur des plates-formes spécifiques si la taille d'un type primitif cause un problème. Personnellement, je n'ai jamais entendu parler de quelqu'un ayant besoin de faire une telle chose. Lorsque des tailles spécifiques sont requises, elles sont généralement utilisées en premier lieu. Mais cela ne signifie pas que cela ne s'est pas produit.

0

Il m'est impossible de dire pourquoi cette bibliothèque particulière l'a fait. Cependant, je l'ai fait semblable dans ma bibliothèque, et je peux donner quelques raisons que vous avez déjà mentionné quelques-uns de:

  1. Il vous permet d'améliorer la portabilité multiplateforme sans avoir xintxx_t types flottant autour.
  2. Il vous permet d'échanger des types - éventuellement au moment de la construction. Un exemple de ceci est si vous vouliez avoir un moteur 3D qui supportait la précision de flotteur simple et double, vous pourriez déclarer typedef float MyLibraryFloat; ou typedef double MyLibraryFloat; déclenché par une macro de définition.
  3. Il peut aider l'abstraction de bibliothèque. Imaginons que vous disposiez d'une bibliothèque faisant office de serveur frontal pour plusieurs bibliothèques différentes avec des API (pour la plupart) compatibles. L'abstraction des types peut aider à cela, bien que ce ne soit souvent pas aussi simple qu'un typedef dans ce cas.

Je pense que la meilleure raison est la seconde. C'est certainement le plus utile si vous faites face à une situation où vos types peuvent changer en fonction des paramètres du compilateur. Cependant, le premier est commun, en particulier dans les anciens programmes C. OpenGL/GLUT fait l'abstraction des types pour la sécurité de la taille.