2013-11-21 8 views
5

considerare questo pezzo di codiceQual è la differenza tra struttura e ambito della funzione in C?

int main(void) 
    { 
     typedef struct { 
      int i; 
     } s; 

     struct { 
      s s; 
     } t; 

     return 0; 
    } 

Si compila bene. Ora date un'occhiata a questa

int main(void) 
    { 
     typedef struct { 
      int i; 
     } s; 

     s s; 
     return 0; 
    } 

Questo codice non compilerà -

‘s’ redeclared as different kind of symbol. 

Domanda: Perché è corretto avere "s s;" come dichiarazione all'interno di una struttura, ma non è corretto avere questa definizione all'interno di una funzione?

risposta

6

Nell'esempio superiore, s è un locale da struct. Non è possibile utilizzarlo senza utilizzare la sintassi t.s, quindi non c'è alcun conflitto con il tipo di struttura s.

Nella struttura di esempio inferiore tipo s e nella variabile s si trovano nello stesso ambito, quindi non è chiaro a quale si sta facendo riferimento.

+0

+1 è buono. Pensi che queste cose sarebbero menzionate in c standard? –

+1

@ Mr.32 Sì, sono menzionati. Penso che siano effettivamente chiamati namespace identificatore lì: * "ogni struttura o unione ha uno spazio separato nome per i suoi membri (disambiguare dal tipo di espressione utilizzata per accedere al membro via o operatore ->.);" * (dal n1547) – user694733

3

Come membro struct, l'identificatore s è ambiguo, perché avrete sempre affrontare come somestruct.s o someptr->s.

Problemi correlati