Maison >développement back-end >C++ >Pourquoi les initialiseurs désignés étaient-ils absents de C 11 ?

Pourquoi les initialiseurs désignés étaient-ils absents de C 11 ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 21:11:11657parcourir

Why Were Designated Initializers Absent from C  11?

Initialiseurs désignés en C : Pourquoi l'absence en C 11

L'omission des initialiseurs désignés en C 11 reste une question intrigante pour de nombreux programmeurs . En C99, la syntaxe d'initialisation désignée, telle que .age = 18, permet une initialisation pratique de membres spécifiques d'une structure. Cependant, cette fonctionnalité est notamment absente de C 11.

Justification de l'exclusion

Le comité de norme C 11 a refusé à plusieurs reprises les propositions d'initialiseurs désignés. Leur justification découle de plusieurs complexités inhérentes :

Ordre d'exécution indéterminé :
C99 ne dispose pas de règles spécifiques pour évaluer les expressions d'initialisation désignées. L'ordre dans lequel les évaluations ont lieu est indéterminé, ce qui peut conduire à des incohérences dans le comportement du programme. En revanche, C applique un ordre strict d'évaluation des clauses d'initialisation.

Problèmes de compatibilité :
L'implémentation d'initialiseurs désignés en C aurait nécessité de rompre la compatibilité avec les implémentations C99 existantes. Cela aurait introduit des incohérences et des erreurs potentielles pour la migration du code.

Restrictions d'imbrication et de tableau :
C99 permet l'imbrication d'initialiseurs désignés et l'initialisation désignée de tableaux. Ces fonctionnalités se sont avérées difficiles à intégrer dans C sans compromettre la cohérence du langage.

Clash des normes C99 :
Les initialiseurs désignés dans C99 permettent également l'initialisation des membres sans spécifier tous les membres. Cela contraste avec l'exigence de C selon laquelle tous ou aucun des membres d'une structure doivent être initialisés à l'aide de désignateurs.

Support limité en C 20

En réponse à la demande de l'industrie, le comité C a depuis introduit une prise en charge limitée des initialiseurs désignés dans C 20. Cependant, cette implémentation impose des restrictions qui répondent aux préoccupations mentionnées ci-dessus. Les initialiseurs désignés doivent être utilisés dans un ordre de déclaration strict, l'imbrication et l'initialisation de tableau ne sont pas prises en charge, et tous ou aucun des membres d'une structure doivent être initialisés avec des désignateurs.

Alternatives

Malgré le manque d'initialiseurs désignés de style C99, C propose des méthodes alternatives pour initialiser la classe membres :

  • Initialisation du constructeur : Permet l'initialisation explicite des membres dans la définition de la classe.
  • Liste d'initialisation des membres : Permet l'initialisation des membres directement au sein du constructeur.
  • Initialisation de l'agrégat : Semblable à désigné initialisation, mais appliqué aux types d'agrégats (par exemple, les structures).

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