2017-10-10 38 views
3

Dans le code suivant, j'ai déclaré une variable de membre de structure sous le même nom de structure.Pourquoi le compilateur ne donne pas une erreur conflictuelle?

struct st 
{  
    int st; 
}; 

int main() 
{ 
    struct st t; 
    t.st = 7; 
    return 0; 
} 

Je me demande, il fonctionne très bien sur compilateur GCC et ne donne pas une erreur de conflit.

Ainsi,

  • Comment le compilateur connaît le nom de la structure et le nom variable?
  • Quel mécanisme utilise le compilateur?
+0

Que renvoient 'main()'? – joop

+5

Les variables et les noms de structure sont des entités différentes pour tout compilateur C à partir de KnR. Trier les différents espaces de noms, si vous le souhaitez. Donc c'est parfaitement normal. – Matt

+0

'struct' demande au compilateur de marquer le' st' suivant comme struct avec la valeur 'st'. De même, le membre «int st» est déclaré comme une variable «int» avec le nom «st». Leurs usages sont orthogonaux, de sorte que le compilateur ne peut pas être confondu pendant l'analyse lexicale. –

Répondre

9

Oui, c'est valide. La balise struct et les membres struct sont dans un espace de noms différent.

C11, 6.2.3 Name spaces of identifiers:

Si plus d'une déclaration d'un identifiant particulier est visible à tout moment dans une unité de traduction, le contexte syntaxique disambiguates utilisations qui se réfèrent à des entités différentes. Ainsi, il existe des espaces de nom distincts pour différentes catégories d'identificateurs, comme suit:

  • noms de libellés (désambiguïsés par la syntaxe de la déclaration et de l'utilisation de l'étiquette);
  • les balises des structures, des unions et des énumérations (désambiguïsées en suivant any32) des mots-clés struct, union, ou enum);
  • les membres de structures ou de syndicats; chaque structure ou union a un espace de nom distinct pour ses membres (désambiguïsés par le type de l'expression utilisée pour accéder au membre via l'opérateur .ou ->);
  • tous les autres identifiants, appelés identificateurs ordinaires (déclarés dans les déclarateurs ordinaires ou comme constantes d'énumération).
3

Le nom du type de structure est struct st. Pas seulement st, donc il n'y a pas de conflit du tout.