Quelle est la raison d’être de typedef vs struct / union / enum, ne pourrait-il y avoir un seul espace de noms?

En C si je déclare un struct / union / enum:

struct Foo { int i ... } 

lorsque je veux utiliser ma structure, je dois spécifier le tag:

 struct Foo foo; 

Pour perdre cette exigence, je dois aliaser ma structure en utilisant typedef:

 typedef struct Foo Foo; 

Pourquoi ne pas avoir tous les types / structures / peu importe dans le même “espace de noms” par défaut? Quelle est la raison derrière la décision d’exiger l’étiquette de déclaration à chaque déclaration de variable (sauf si typdefe’d) ???

Beaucoup d’autres langues ne font pas cette distinction, et il semble que cela apporte seulement un niveau de complexité supplémentaire à mon humble avis.

Les structures / enregistrements ont été très tôt ajoutés à B, juste après que Dennis Ritchie ait ajouté la structure de base ‘typée’. Je crois que la syntaxe de struct originale n’avait pas du tout de balise, pour chaque variable vous avez créé une struct anonyme:

 struct { int i; char a[5]; } s; 

Plus tard, la balise a été ajoutée pour permettre la réutilisation de la structure, mais elle n’était pas vraiment considérée comme un “type” réel. En outre, la suppression de la struct / union rendrait l’parsing impossible:

 /* is Foo a union or a struct? */ Foo { int i; double x; }; Foo s; 

ou casser le paradigme de la syntaxe de déclaration qui imite la syntaxe d’expression, qui est si fondamental pour C.

Je soupçonne que typedef été ajouté beaucoup plus tard, possible quelques années après la «naissance» de C.

L’argument “C était la langue de plus haut niveau à l’époque.” ne semble pas vrai. Algol-68 y est antérieur et contient des enregistrements comme types appropriés. La même chose vaut pour Pascal.

Si vous souhaitez en savoir plus sur l’histoire du C, vous trouverez peut-être une lecture intéressante dans “Le développement du langage C” de Ritchie.

Eh bien, les autres langues supportent aussi généralement les espaces de noms. C pas.

Ce n’est probablement pas la raison, mais il est logique d’avoir au moins cet espace de noms naturel.

Question interessante! Voici mes pensées.

Lorsque C a été créé, il existait peu d’abstraction sur le langage d’assemblage. Il y avait FORTRAN, B et d’autres, mais lorsque C est apparu, il s’agissait sans doute du langage le plus avancé. Son objective était de fournir une fonctionnalité et une syntaxe suffisamment puissantes pour créer et maintenir un système d’exploitation. Le résultat est remarquable.

Penser qu’à l’époque, porter un système sur une nouvelle plate-forme impliquait de réécrire et d’adapter des composants au langage d’assemblage de la plate-forme. Avec la publication de C, il a finalement fallu porter le compilateur C et recomstackr le code existant.

À l’époque, c’était probablement un atout que la syntaxe même du langage vous oblige à différencier les types pouvant entrer dans un registre et les types qui ne le pouvaient pas.

La syntaxe de la langue a beaucoup évolué depuis, et la plupart des choses que nous avions l’habitude de voir dans les langues modernes sont absentes du C. Les espaces de noms définis par l’utilisateur n’en sont qu’un, et je ne pense pas que le concept de “sucre de syntaxe” “existait même à l’époque. Ou plutôt, C était le sumt de la syntaxe sucre.

Nous sums entourés de choses comme ça. Regarde ton clavier: pourquoi avons-nous une touche PAUSE / BREAK? Je ne pense pas avoir appuyé sur cette touche pendant des années.

C’est l’inheritance d’une époque où cela avait du sens.