Maison > développement back-end > C++ > Pourquoi C 11 ne prend-il pas en charge les initialiseurs désignés comme C99 ?

Pourquoi C 11 ne prend-il pas en charge les initialiseurs désignés comme C99 ?

Mary-Kate Olsen
Libérer: 2024-12-12 16:01:09
original
591 Les gens l'ont consulté

Why Doesn't C  11 Support Designated Initializers Like C99?

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 };
}
Copier après la connexion

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() };
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal