en C si je déclare une structure / union / Enum: Lorsque je veux utiliser ma structure, je dois spécifier la balise: p> Pour perdre cette exigence, je dois alias ma structure à l'aide de typedef: p> pourquoi ne pas avoir tous les types / structs / quel que soit le même "espace de noms" par défaut? Quelle est la justification de la décision d'exiger le tag de déclaration à chaque déclaration de variable (sauf si Typdefe'd) ??? P> De nombreuses autres langues ne font pas cette distinction, et il semble que cela n'apporte qu'un niveau supplémentaire de complexité IMHO. P> P>
3 Réponses :
Eh bien, d'autres langues soutiennent généralement généralement les espaces de noms. C non. P>
Ce n'est probablement pas la raison, mais il est logique d'avoir au moins cet espace de noms naturel. P>
Question intéressante! Voici mes pensées. P>
Lorsque c a été créé, peu d'abstraction existait sur la langue d'assemblage. Il y avait Fortran, B et d'autres, mais lorsque c est venu être c'était sans doute le langage de niveau le plus élevé existant. Il est que l'objectif était de fournir une fonctionnalité et une syntaxe suffisamment puissante pour créer et maintenir un système d'exploitation et réussir remarquablement. P>
Pensez que, à l'époque, portant un système à une nouvelle plate-forme signifiait la réécriture et l'adaptation des composants à la langue de l'assemblage de la plate-forme. Avec la libération de C, il est finalement descendu pour porter le compilateur C et recompiler le code existant. P>
C'était probablement un atout à l'époque que la syntaxe même de la langue vous a forcé à différencier les types pouvant correspondre à un registre et à des types qui ne pouvaient pas. P>
La syntaxe de langue a beaucoup évolué depuis lors, et la plupart des choses que nous avons utilisées pour voir dans les langues modernes sont manquantes dans C. Les espaces de noms définis par l'utilisateur ne sont que l'un d'entre eux et je ne pense pas que le concept de "Syntaxe Sugar" a même existé à l'époque. Ou plutôt, c était le sommet du sucre de syntaxe. P>
Nous sommes entourés de choses comme ça. Je veux dire, jetez un coup d'œil à votre clavier: pourquoi a-t-on une clé de pause / break? Je ne pense pas que j'ai appuyé cette clé pendant des années. P>
C'est héritier d'une heure dans laquelle il a du sens. p>
Je frappe régulièrement ma clé de pause / casse-tête. L'utilisation la plus courante, pour moi, est d'interrompre la compilation ou de briser avec le débogueur.
Les structures / enregistrements étaient une addition pré-c très précoce à B, juste après que Dennis Ritchie a ajouté une structure de base "dactylographiée". Je crois que la syntaxe d'origine plus tard plus tard , la balise a été ajoutée pour permettre la réutilisation de la mise en page de la structure, mais elle n'a pas été vraiment considérée comme un «type» réel. En outre, supprimer le ou casser la syntaxe de déclaration ' Mimics Expression Syntaxe ' EM> Paradigm tellement fondamental pour c. P> Je soupçonne que L'argument "C était la langue de niveau la plus élevée à l'époque". ne semble pas vrai. Algol-68 l'antériole et comporte des enregistrements en tant que types appropriés. La même chose pour Pascal. P> Si vous aimez en savoir plus sur l'historique de C, vous pourriez trouver Ritchie's " Le développement du langage C " une lecture intéressante. P> p> struct code> n'a pas eu de balise, pour chaque variable que vous avez créée un
struct anonyme code>:
struct
/
union code> permettrait d'analyser impossible: p>
Typedef code> a été ajouté beaucoup plus tard, possibles quelques années après la "naissance" de C . P>
Je ne vois pas vraiment ce que cela a à voir avec la question. L'OP demande pourquoi ils ont besoin de dire struct foo foo code> au lieu de
foo foo code> lorsque vous déclarez une variable, ne définissant pas le type.
@Detly: Je voulais fournir un contexte, mais j'aurais pu être davantage au point: Parce que les tags ne commençaient pas comme des types réels et de s'assurer que «la syntaxe de déclaration de syntaxe de syntaxe» reste possible. I >
D'accord, cela a plus de sens. Je ne pense jamais vraiment à la règle de la règle de la syntaxe de la syntaxe de la Déclaration de la syntaxe de la syntaxe de la syntaxe de la syntaxe de la syntaxe de la Syntaxe au-delà des types de pointeur.
Pas plus complexe que '#define lpfoo * foo' tout sur le lieu :( Cependant, dans la plupart des codes que j'ai vu struct foo et foo reçoit des noms différents (par exemple, foo_t et foo ou qu'avez-vous) même si elles sont différentes «Espaces de noms» au compilateur.
Pouvez-vous s'il vous plaît mentionner quelles sont les "autres langues" sauf pour C ++?
@Arun: C # et Java ne placent pas leurs types dans un "espace de noms de balises séparé" (mais ils peuvent être dans un espace de noms réel, y compris l'espace de noms global, qui est un peu différent de l'espace de noms de balises introduit par c)