2010-10-09 8 views
6

En C, si declaro una estructura/unión/enumeración:¿Cuál es el razonamiento detrás de typedef vs struct/union/enum, no podría haber solo un espacio de nombres?

struct Foo { int i ... } 

cuando quiero usar mi estructura que tenga que especificar la etiqueta:

struct Foo foo; 

a perder este requisito, tengo que alias de mi estructura mediante typedef:

typedef struct Foo Foo; 

por qué no tienen todos los tipos/estructuras/lo que sea en el mismo "espacio de nombres" por defecto? ¿Cuál es el razonamiento detrás de la decisión de requerir la etiqueta de declaración en cada declaración de variable (a menos que se tipifique)?

Muchos otros idiomas no hacen esta distinción, y parece que solo está trayendo un nivel extra de complejidad en mi humilde opinión.

+0

No es más complejo que '#define LPFOO * FOO' todo sobre el lugar :(Sin embargo, en la mayoría de los códigos he visto que a struct Foo y Foo se les asignan diferentes nombres (por ejemplo, Foo_t y Foo o incluso) están en diferentes 'espacios de nombres' para el compilador. –

+0

¿Puede mencionar cuáles son "otros idiomas" excepto C++? – Arun

+0

@Arun: C# y Java no colocan sus tipos en un "espacio de nombre de etiqueta separado" (pero pueden estar en un espacio de nombres verdadero, incluido el espacio de nombres global, que es un poco diferente del espacio de nombres de etiquetas introducido por C) – paercebal

Respuesta

2

Las estructuras/registros fueron una adición pre-C muy temprana a B, justo después de que Dennis Ritchie añadiera la estructura básica "tipada". Creo que la sintaxis original de struct no tenía una etiqueta en absoluto, para cada variable que se ha hecho un anónimo struct:

struct { 
    int i; 
    char a[5]; 
} s; 

Posteriormente, se añadió la etiqueta para permitir la reutilización del diseño de la estructura, pero no era realmente considerado como un "tipo" realAdemás, la eliminación de la struct/union haría imposible el análisis:

/* is Foo a union or a struct? */ 
Foo { int i; double x; }; 
Foo s; 

o romper el 'declaración imita la sintaxis Sintaxis de las expresiones' paradigma que es tan fundamental para C.

Sospecho que typedef se añadió mucho más tarde, posible unos años después del 'nacimiento' de C.

El argumento "C era el lenguaje de nivel más alto en ese momento". no parece verdad Algol-68 es anterior a él y tiene registros como tipos adecuados. Lo mismo vale para Pascal.

Si desea obtener más información sobre la historia de C, puede encontrar Ritchie's "The Development of the C Language" una lectura interesante.

+0

Realmente no veo lo que tiene que ver con la pregunta. El OP pregunta por qué necesitan decir 'struct Foo foo' en lugar de' Foo foo' al declarar un va riable, sin definir el tipo. – detly

+0

@detly: Quería proporcionar algo de contexto, pero podría haber ido más al grano: * Porque las etiquetas no comenzaron como tipos reales y para asegurarse de que 'la sintaxis de declaración imita la sintaxis de expresión' sigue siendo posible. * – schot

+0

bien, eso tiene más sentido. Realmente nunca pienso en la regla de 'sintaxis de declaración imita la sintaxis de expresión' más allá de los tipos de puntero. – detly

0

Bueno, otros lenguajes también suelen admitir espacios de nombres. C no.

Probablemente no sea la razón, pero tiene sentido tener al menos este espacio de nombres natural.

0

¡Pregunta interesante! Aquí están mis pensamientos

Cuando se creó C, existía poca abstracción sobre el lenguaje ensamblador. Había FORTRAN, B y otros, pero cuando C llegó a ser, podría decirse que fue el idioma de más alto nivel que existe. Su objetivo era proporcionar funcionalidad y sintaxis lo suficientemente poderosas para crear y mantener un sistema operativo, y tiene un éxito notable.

Creo que, en ese momento, transferir un sistema a una plataforma nueva significaba reescribir y adaptar componentes al lenguaje ensamblador de la plataforma. Con el lanzamiento de C, finalmente se decidió portar el compilador de C y volver a compilar el código existente.

Probablemente fue un activo en aquel entonces que la misma sintaxis del lenguaje lo forzaba a diferenciar entre los tipos que podían caber en un registro, y los tipos que no podían.

La sintaxis del lenguaje ha evolucionado mucho desde entonces, y la mayoría de las cosas que solemos ver en los lenguajes modernos faltan en C. Los espacios de nombres definidos por el usuario son solo uno de ellos, y no creo que el concepto de "azúcar sintáctica" incluso existía en aquel entonces. O más bien, C fue el pico de la sintaxis del azúcar.

Estamos rodeados de cosas como esta. Quiero decir, eche un vistazo a su teclado: ¿por qué tenemos una tecla PAUSE/BREAK? No creo que haya presionado esa tecla durante años.

Es herencia de una época en la que tenía sentido.

+0

Toco mi tecla PAUSE/BREAK con regularidad. El uso más común, para mí, es interrumpir la compilación o romper con el depurador. – mrduclaw

Cuestiones relacionadas