J’aimerais bien comprendre la hiérarchie des types du langage C11 et la présenter graphiquement (un diagramme en arbre serait parfait). La norme ne fournit aucun chiffre pour ce problème – il existe 30 points décrivant les types individuels et les relations entre eux. Je voudrais le dessiner.
Ma tentative a commencé par obtenir le projet de comité N1570 du comité ISO / IEC 9899: 201x et à extraire toutes les déclarations essentielles de la section 6.2.5 du document. Ensuite, j’ai commencé à réorganiser les connaissances sous la forme d’un arbre. Permettez-moi de présenter mon travail en deux étapes.
Les connaissances extraites (point dans la section 6.2.5 + production spécifiée):
signed char
, short int
, int
, long int
, long long int
; _Bool
, caractère unsigned char
, unsigned short int
, unsigned int
, unsigned long int
, unsigned long long int
; float
, double
, long double
; float _Complex
, double _Complex
, long double _Complex
; char
+ types entiers signés + types entiers non signés + types flottants; char
, signed char
unsigned char
. Et la structure résultante:
types object types function types basic types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex standard integer types standard sίgned integer types standard unsίgned integer types extended integer types extended sίgned integer types extended unsίgned integer types character types char, signed char, unsigned char
Les déclarations restantes:
char
+ types entiers signés + types entiers non signés + types énumérés; Et la structure finale du système de type C11:
types object types function types basic types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex standard integer types standard sίgned integer types standard unsίgned integer types extended integer types extended sίgned integer types extended unsίgned integer types character types char, signed char, unsigned char real types integer types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types enumeration types real floating types float, double, long double scalar types arithmetic types integer types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types enumeration types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex pointer types derived types array types structure types unίon types function types pointer types atomic types aggregate types array type structure type derived declarator types array type structure type pointer type
Maintenant, je dois réduire la structure (idéalement à un seul arbre) ou trouver un moyen plus délicat de représenter les relations. Je voudrais sortir avec une belle feuille de cheet pour le système de dactylographie C11. Des idées?
La structure encombrée des types C11 résultant de la deuxième étape de la question peut être simplifiée en supprimant / réduisant les nœuds moins importants et en déléguant certaines informations redondantes / subsidiaires à présenter par d’autres moyens.
Je propose l’algorithme en cinq étapes suivant:
Le résumé du système de type C11 résultant se présente comme suit:
Les traits / zones gris sont introduits pour améliorer la lisibilité de l’arbre.
Le résumé de type n’inclut pas le concept de “complétude de déclaration de type” car il s’agit d’un état observé à un moment donné dans une unité de traduction . Au moment de l’exécution, tous les objects et fonctions sont des instances d’un type complet . Le type void
est une exception mais, en tant que no-type (ou n’importe quel type dans le cas d’un pointeur), il est intentionnellement exclu du diagramme.
Les _Atomic
const
, volatile
, ressortingct
et _Atomic
sont des qualificateurs de type qui, contrairement aux spécificateurs de type pour les types dérivés , ne peuvent pas être appliqués de manière récursive. Toute combinaison de ces éléments peut précéder toute définition de type (dans la mesure où cela a du sens). Par conséquent, les inclure dans le diagramme compliquerait la tâche tout en n’introduisant aucune information appropriée. L’exception apparente rend la construction _Atomic (type)
, qui est prise en compte en tant que spécificateur de type pour le type atomique – l’un des types dérivés listés dans la norme C11.