Je lis actuellement un projet de spécification C11. Les nouveaux mots clés introduits: _Bool, _Alignof, _Atomic
tous ressemblent à des extensions personnalisées, au lieu de mots clés réservés standard comme struct, union, int
.
Je me rends compte que la norme consiste essentiellement en extensions standardisées ... mais quand même, c'est affreux! Peut-être que nous finirons bientôt par __Long_Long_Reallylong_Integer_MSVC_2020_t
ramper dans la norme!
La compatibilité descendante du code non standard est-elle la seule raison du nouveau style des mots-clés?
<stdbool.h>
fichier d'en-tête d'implémentation C11 doit inclure une macro de préprocesseur telle que#define bool _Bool
. Il s'agit d'une solution intéressante car elle conserve la compatibilité descendante, mais permet à tout nouveau code, qui inclut le nouveau fichier d'en-tête, d'utiliser la syntaxe la plus attrayante.Réponses:
J'imagine que la rétrocompatibilité avec du code parfaitement standard est une raison plus importante.
Si vous ajoutez un mot-clé qui aurait pu être utilisé comme identifiant légitime dans le code précédent, vous créez une tonne de douleur, d'erreurs subtiles possibles, en particulier en C, un langage avec des règles d'analyse en quelque sorte compliquées.
Si ces identifiants ont été utilisés comme interface publique quelque part, vous alourdissez tous les utilisateurs de ces bibliothèques malheureuses, qui pourraient ne pas utiliser C du tout, mais appelez la bibliothèque à partir de Ruby, ou Python, etc.
C'est pourquoi les nouveaux mots clés ressemblent moins à de beaux mots qu'à des hacks bolt que les gens ont moins de chances d'utiliser déjà dans un autre but.
la source
Bool
dans le code hérité qui a été largement accepté comme étant un booléen mais jamais en fait partie de la norme C, donc l'hypothèse n'est pas sûre de faire.bool
serait plus dans l'esprit de C. Aussi, je ne suis pas complètement convaincu par cette réponse, car des mots laids pourraient également avoir été utilisés par du code non standard. Et changer le style des mots rend les mots standard plus difficiles à reconnaître en un coup d'œil.bool
était ajouté inconditionnellement à la langue, alors tous les projets qui ont leur propre version (parfaitement légitime) debool
cesseraient de compiler. Cela nuirait gravement à l'acceptation de la révision linguistique. C'est la raison pour laquelle tous les nouveaux identifiants sont extraits de l'ensemble réservé (commençant ainsi par_[capital]
). Comme il y avait également une forte demande pourbool
elle-même, cela a été ajouté commetypedef _Bool bool
dans<stdbool.h>
.stdbool.h
ou de mettre à jour leur propre typedef vers le nouveau type pour prendre en charge leur code hérité.Les noms commençant par un trait de soulignement et une lettre majuscule (et tout ce qui a un double trait de soulignement) étaient réservés à l'implémentation du compilateur / bibliothèque standard dans les normes précédentes.
À partir des identificateurs réservés de C89 et C99:
Donc, en théorie, ces nouveaux mots-clés ne devraient pas être utilisés dans aucun code écrit auparavant et cela conduit à une meilleure compatibilité descendante que n'importe quel nom simple, ce qui est probablement la seule raison.
la source