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 comme static, extern et auto, 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.