2010-04-06 15 views
8

Ho un problema con le parole chiave typedef in linguaggio C.Grammatica e sintassi di typedef in linguaggio C

Nel mio programma, ho utilizzare i seguenti codici:

typedef int* a[10]; 

int main(){ 
int a[10]; 
} 

funzionano bene. Ma perché non ci sono conflitti tra una variabile e un tipo che condivide lo stesso nome a?

Saluti.

+0

Domanda interessante: non l'ho mai considerato. Il tipo che definisci è dannatamente strano, spero che sia solo a scopo dimostrativo :-) –

+0

Hai ragione, non voglio neanche che il mio codice sia difficile da leggere come un puzzle. :-) –

+0

Wow, GCC va anche bene con "a a;" (purché sia ​​principale, non globale) –

risposta

6

Vedi msdn C language reference:

Typedef nomi condividono lo spazio dei nomi con identificatori ordinari (vedi Name Spaces per maggiori informazioni). Pertanto, un programma può avere un nome typedef e un identificatore di ambito locale con lo stesso nome.

+1

Citazione curiosa. Leggendolo velocemente sembra un ossimoro. Se condividono uno spazio dei nomi, come potrebbero avere lo stesso nome? È a causa dello * scope * locale? –

+0

Hmm ... il link "Name Spaces" a cui si punta dice: "I nomi typedef non possono essere usati come identificatori nello stesso ambito." –

+3

@Eli: '{int x; {float x;}} ' – sbi

6

Lo standard C dice (Sezione 6.2.1 - Scopes di identificatori):

Un identificatore può denotare un oggetto; una funzione ; un tag o un membro di una struttura, unione o enumerazione ; a nome typedef; un nome di etichetta; una macro nome; o un parametro macro. Lo stesso identificatore può indicare diverse entità in diversi punti nel programma .

K & R2 dire (A.11.1 - Ambito lessicale)

identificatori rientrano in diversi nomi spazi che non interferiscono con una altro; lo stesso identificatore può essere utilizzato per scopi diversi, anche nello dello stesso ambito, se gli usi sono in spazi di nome diverso . Queste classi sono: oggetti, funzioni, typedef nomi e costanti enum; etichette; tag di strutture o sindacati e enumerazioni ; e membri di ciascuna struttura o unione singolarmente.

Devo ammettere che questo mi confonde. Leggendo la seconda citazione appare che i nomi delle variabili e i tipi typedef -ed devono coincidere con lo.

+0

Ma non sono ancora molto chiaro in che modo un "denoting" di entità diverse coesiste nei codici precedenti. Potresti darmi ulteriori spiegazioni, per favore? Grazie. –

+1

@Neil: Ho letto la punteggiatura in modo diverso. Sembra che oggetti, funzioni, nomi typedef e costanti enum siano una classe. Successivo (dopo un punto e virgola) etichette, tag successivi, ecc. –

3

Variabili e typedef occupano lo spazio dei nomi stessa, e può non nomi di condivisione con gli altri identificatori esattamente nello stesso ambito.

Tuttavia il secondo a è all'interno di main e le regole di ambito si applicano: il secondo a sovrascrive il primo.

È possibile fare la stessa cosa con le variabili solo pianura:

int a; 

int main() { 
    int a; 
} 

Si noterà che se si sposta la dichiarazione della variabile esterno principale, il programma non verrà compilato.