2010-04-06 17 views
8

Tengo un problema con las palabras clave typedef en lenguaje C.Gramática y sintaxis de typedef en lenguaje C

En mi programa, utilizar los siguientes códigos:

typedef int* a[10]; 

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

que funcionan bien. Pero ¿por qué no hay conflictos entre una variable y un tipo que comparte el mismo nombre a?

Atentamente.

+0

Pregunta interesante: nunca he considerado esto. Sin embargo, el tipo que defines es muy raro, espero que sea solo para demostraciones :-) –

+0

Tienes razón, tampoco quiero que mi código sea tan difícil de leer como un acertijo. :-) –

+0

Wow, GCC incluso está de acuerdo con "a a"; (siempre y cuando esté en main, no global) –

Respuesta

6

Ver msdn C language reference:

Typedef nombres comparten el espacio de nombres con identificadores ordinarios (ver Name Spaces para más información). Por lo tanto, un programa puede tener un nombre typedef y un identificador de ámbito local con el mismo nombre.

+1

Cita curiosa. Leerlo rápidamente se siente como un oxímoron. Si comparten un espacio de nombre, ¿cómo podrían tener el mismo nombre? ¿Esto es por el * alcance local *? –

+0

Hmm ... el enlace "Espacios de nombre" al que apunta dice: "Los nombres de Typedef no pueden usarse como identificadores en el mismo ámbito". –

+3

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

6

El estándar C dice (Sección 6.2.1 - Scopes de identificadores):

Un identificador puede denotar un objeto; una función ; una etiqueta o un miembro de una estructura, unión o enumeración ; un nombre typedef ; un nombre de etiqueta; un nombre macro ; o un macro parámetro. El mismo identificador puede denotar diferentes entidades en diferentes puntos en el programa .

K & R2 decir (A.11.1 - Alcance léxico)

Identificadores se dividen en varias nombre espacios que no interfieren con uno otra; el mismo identificador puede ser usado para diferentes propósitos, incluso en el mismo alcance, si los usos están en espacios de nombres diferentes. Estas clases son: objetos, funciones, typedef nombres, y constantes enum; etiquetas; etiquetas de estructuras o uniones, y enumeraciones; y miembros de cada estructura o unión individualmente.

Debo admitir que esto me confunde. Al leer la segunda cita, aparece que los nombres de las variables y typedef -ed tipos deben coincidir con.

+0

Pero todavía no estoy muy claro cómo puede "a" denotar diferentes entidades coexiste en los códigos precedentes. ¿Podría darme más explicaciones, por favor? Gracias. –

+1

@Neil: Leo la puntuación de manera diferente. Parece que los objetos, las funciones, los nombres typedef y las constantes enum son de una clase. Siguiente (después de un punto y coma) etiquetas, etiquetas siguientes, etc. –

3

Variables y typedefs ocupan el espacio de nombres misma, y ​​puede no nombres de recursos compartidos con otros identificadores en exactamente el mismo alcance.

Sin embargo, su segundo a está dentro de main, y se aplican las reglas de alcance: el segundo a prevalece sobre el primero.

Usted puede hacer lo mismo con las variables apenas aclara:

int a; 

int main() { 
    int a; 
} 

Se dará cuenta de que si se mueve la declaración de variables fuera principal, el programa no compilará.

Cuestiones relacionadas