Maison >développement back-end >C++ >Pourquoi les initialiseurs désignés C 11 n'existent-ils pas ?

Pourquoi les initialiseurs désignés C 11 n'existent-ils pas ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-13 15:18:11422parcourir

Why Don't C  11 Designated Initializers Exist?

Désignation de l'absence d'initialiseurs désignés en C 11

Dans le domaine de la programmation, les initialiseurs désignés ont pris de l'importance dans la norme C99. Ces initialiseurs ont permis aux développeurs d'attribuer des valeurs aux membres de la structure de manière sélective, améliorant ainsi la lisibilité et la concision du code. Cependant, une absence notable de ces initialiseurs est apparue dans la norme C 11, ce qui a incité à s'interroger sur la justification de cette omission.

Le comité de la norme C 11 a délibéré à plusieurs reprises sur l'inclusion d'initialiseurs désignés, en examinant des propositions visant à adopter le fonctionnalité. Cependant, le consensus reste un rejet catégorique de ces propositions. Le comité estime que les efforts visant à mettre en œuvre des initialiseurs désignés ont historiquement rencontré des défis insurmontables.

Considérez l'extrait de code suivant en C99 :

struct Person
{
    int height;
    int weight;
    int age;
};

int main()
{
    Person p { .age = 18 };
}

Ce code attribue une valeur au membre d'âge de la personne. struct tout en laissant les autres membres non initialisés. C99 permet une telle initialisation sélective, mais pas C 11.

L'une des principales raisons de l'exclusion des initialiseurs désignés dans C 11 provient de l'ordre d'évaluation imprévisible des initialiseurs dans C99. La norme décrit vaguement cet ordre comme étant « séquencé de manière indéterminée », laissant place à un comportement inattendu du programme. Par exemple, si l'initialisation de la structure Person impliquait des appels de fonction avec des effets secondaires, l'ordre d'exécution pourrait avoir des conséquences inattendues, que le compilateur ne signalerait pas nécessairement.

En revanche, C a des exigences strictes en matière d'initialisation. évaluation de la liste, garantissant que les initialiseurs sont exécutés dans l’ordre dans lequel ils apparaissent. Pour appliquer une telle ordonnance, il aurait fallu rompre la compatibilité avec la conception C99 précédente, ce que le comité a jugé inacceptable.

Bien que l'absence d'initialiseurs désignés dans C 11 ait pu initialement susciter des critiques, les limitations imposées à leur inclusion dans C 20 ont répondu à des préoccupations concernant un comportement indéterminé. L'ordre d'évaluation standardisé dans C 20 offre aux développeurs une plus grande certitude et un plus grand contrôle sur le processus d'initialisation.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn