Exclusion des initialiseurs désignés par C 11 : justification du comité
En C99, les initialiseurs désignés offrent un moyen pratique d'initialiser des membres spécifiques d'une structure , comme illustré par l'exemple suivant :
struct Person { int height; int weight; int age; }; int main() { Person p = { .age = 18 }; }
Cependant, en C 11, cette syntaxe n'est pas valide. Le comité standard C 11 a rejeté à plusieurs reprises les propositions visant à inclure le support d'initialiseur désigné, malgré son caractère pratique dans C99.
Raisons de l'exclusion
La principale préoccupation du comité découle de la durée indéterminée ordre d'évaluation des sous-expressions dans les initialiseurs désignés par C99. Prenons l'exemple suivant :
struct X { int c; char a; float b; }; struct X foo = { .a = (char)f(), .b = g(), .c = h() };
En C99, l'ordre dans lequel ces appels de fonction (f(), g() et h()) s'exécuteraient n'est pas défini. Cette ambiguïté pourrait conduire à un comportement indéterminé du programme si ces fonctions interagissent ou ont des effets secondaires.
Exigences strictes de l'initialiseur de C
Contrairement à l'ordre d'évaluation flexible de C99, C impose une évaluation séquentielle stricte des clauses d’initialisation. En conséquence, l'implémentation d'initialiseurs désignés en C aurait nécessité un comportement différent :
f(); g(); h();
Cela aurait rompu la compatibilité avec les implémentations C99 existantes.
Solutions proposées et limitations
La norme c 20 résout partiellement ce problème avec l'introduction de P0329R4, qui permet une prise en charge limitée des initialiseurs. Cependant, cette prise en charge est limitée pour éviter les complexités et les pièges potentiels associés à un ordre d'évaluation indéterminé.
Conclusion
La décision du comité de norme C 11 d'exclure les initialiseurs désignés a été motivée par le souci de maintenir un processus d'initialisation cohérent et prévisible. Bien que Boost fournisse une implémentation pour les initialiseurs désignés, le comité des standards a souligné les défis liés à l'intégration d'une telle fonctionnalité en C sans introduire de complexités ni rompre la compatibilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!