Pourquoi est-ce que C besoin “struct” mot-clé et pas du C++?
J'ai toujours été un peu confus au sujet de ce qui se passe ici:
#include <stdio.h>
int main() {
timeval tv;
tv.tv_sec = 1;
for (;;) {
select(0, 0, 0, 0, &tv);
printf("%s\n", "Hello World!");
}
}
Désolé si ça ne compile pas, juste l'a écrit comme un exemple rapide.
Ce Code ne compile pas sous gcc, sauf si j'ajoute le mot-clé struct avant l'utilisation de la struct timeval. g++ sur l'autre main s'occupe de fines comme est.
Est-ce une différence entre la façon dont le C et le C++ poignée de structures ou est-ce juste une différence dans les compilateurs? (Je suis très C++ orienté, et l'utilisation de struct en C sur des lignes comme cela a toujours un peu déconcerté moi).
- J'aime à penser que C le fait d'avoir une "définition de type de l'espace de noms" et une "structure de l'espace de noms". Si une structure n'est pas la définition de type d, vous devez explicitement de mettre le "struct" afin de "résoudre" son "espace de noms". Vous pouvez imaginer que le C++ automatiquement les mandrins à toutes les structures dans la "définition de type de l'espace de noms". Bien sûr ce n'est pas vraiment ce qu'il se passe, mais je trouve ce modèle mental utile.
- C a besoin de la clé, parce que c'est sa syntaxe. Je ne suis pas sûr de ce qui est demandé ici. Vous vous demandez à propos de la conception de la justification?
- pour plus de la confusion, de la "typedef" espace de noms est en fait l'objet de l'espace de noms;
typedef
est une classe de stockage commestatic
,extern
etauto
, donc une définition de type de déclaration est la syntaxe est la même que pour un objet de la déclaration. - c'est à peu près exactement ce qui se passe, C struct balises sont dans leur propre espace de noms, et .. ce que Simon dit à propos de la définition de type d'espace de noms. Dans l'original K+R C, tous les noms de les membres de la structure ont été dans un espace de noms commun - c'est pourquoi l'ancien système des structures comme "struct stat' tous ont des préfixes ( st_dev, st_ino, st_mode ...) pour éviter les collisions avec les membres d'autres structures. Chaque nom est associé à un type et d'un offset, pas quelle structure il était. Si l' -> opérateur ne se soucie pas de ce type de pointeur est sur la gauche. Qui a été résolu assez rapidement cependant.
Vous devez vous connecter pour publier un commentaire.
Syntaxiquement à la fois traiter
struct
presque la même. Seulement C++ a ajouté une règle qui permet d'omettre lestruct
(etclass
) mot-clé si il n'y a pas d'ambiguïté.Si il y a ambiguïté, aussi en C++ requiert l'
struct
mot-clé dans certains endroits. Un exemple bien connu eststat
sur POSIX systèmes où il y a unstruct stat
et une fonctionstat
.stat
!!struct sigaction
etint sigaction(...)
méthode pour la gestion des signaux sous Linux (à partir designal.h
) où vous avez besoin destruct
mot-clé si vous souhaitez utiliser lestruct
Je dirais que c'est une décision de conception des deux langues.
Struct en C sont juste structuré des registres d'usage différent, puis intégré dans le type.
C++ a ctors et la surcharge de l'opérateur et donc ils agissent comme des types.
C++:
Comme une note,
struct foo
est encore autorisé en C++.struct foo
est plus facile à analyser puis typedef avaisfoo
que le nom de la recherche est plus simple.Envisager l'idée originale de C++ (ou, lorsque c'était juste une idée, "C with classes"), que d'un OO-langage orienté qui était compatible avec le C au point où la plupart valide les programmes C sont aussi valides les programmes C++.
C++ construit son modèle de classe en commençant par C
struct
et en ajoutant plus de fonctionnalités:public
,private
etc)this
paramètre - de nombreuses implémentations sont toujours similaires dans la pratique).À ce stade, il y avait deux problèmes. La première est que, par défaut, l'accès devait être public, car C est pas de se cacher de l'information et, par conséquent, à partir d'un C++ point de vue a tout public. Pour une bonne OO un par défaut devrait privé. Cela a été résolu par l'ajout d'
class
qui est à peu près identique àstruct
sauf pour la valeur par défaut estprivate
plutôt quepublic
.L'autre, c'est que ce OO point de vue doit avoir
timeval
ou de tout autre class/struct sur le même "pied" commeint
ouchar
, plutôt que de constamment annoté dans le code spécial. Cela a été résolu par l'assouplissement de la règle que l'on doit placerstruct
(ouclass
) devant le nom du type dans la déclaration d'une variable de ce type. Doncstruct timeval tv
peut devenirtimeval tv
.Ce puis influencé plus tard, la syntaxe C OO langages, comme Java et C#, au point où, par exemple, que la forme courte (
timeval tv
) serait une erreur de syntaxe en C#.C'est tout simplement une différence dans les langues. C++ est plus permissif dans sa structure de la syntaxe.
namespace
mot clé de C++C'est juste la façon dont C ressemble. Par conséquent, les modèles suivants est assez commune dans C:
Vous pouvez y faire référence de la même manière, comme en C++.
La façon dont C fait il est venu en premier, bien sûr. Les structures et les classes en C++ sont presque identiques, et il aurait été très gênant pour exiger
class
avec chaque variable de classe de sorte qu'il a été simplifié pour les deux.