2013-03-25 9 views
5

Sono curioso della motivazione di questo comportamento in C. Era intenzionale o un incidente?Perché i tag struct non sono nomi di tipo in C?

struct tpoint // tpoint is not a type name 
{ 
    int x, y; 
}; 

typedef struct tpoint Point; // point is a type name. 

Voglio sapere perché Ritchie o il comitato standard ha scelto questo comportamento.

+1

È improbabile che Dennis Ritchie sia in grado di rispondere alla tua domanda ... Se la risposta non è presente nel documento Rationale (http://www.open-std.org/jtc1/sc22/wg14/ www/C99RationaleV5.10.pdf), quindi questa domanda probabilmente non è risolvibile ... –

+0

Penso che troverete che 'struct tag' ha preceduto' typedef' di alcuni anni, e quindi era tutto giù alla compatibilità all'indietro . C++ ha fatto come vuoi Prova a cercare "Primeval C". Ho un file tar 'v6root.tar' che contiene sorgenti con molti 'struct' ma nary a' typedef' in esso. Questo dovrebbe essere il codice sorgente di Unix V6. Unix V7 aveva 'typedef'. –

+0

La ragione più ovvia è che con solo 'struct' e' union', il linguaggio era ancora context-free - non è stato fino alla successiva aggiunta di 'typedef' che il linguaggio C richiedeva un parser sensibile al contesto. – caf

risposta

4

È una cosa del namespace. In questo modo, posso avere struct a, enum a, union a e nessuno di essi è ambiguo. Aiuta nella progettazione di quadri che possono avere nomi di tipi simili, ma può confondersi rapidamente.

+0

Ma voglio sapere perché il comitato standard o Dennis Ritchie ha scelto questo comportamento. – Rayniery

+1

Questo è certamente vero, ma non so che sia la risposta definitiva, o il ragionamento originale alla base della decisione dei signori Kernighan e Ritchie. –

+1

@ Rayniery nessuno di noi è loro - non possiamo dirti cosa stavano pensando quando hanno progettato la lingua. Possiamo solo speculare e la speculazione non porta mai a qualcosa di buono. –

0

Leggendo The Development of the C Language, quando Dennis Ritchie discute embrionali C descrive la sua intenzione di struct:

ho voluto la struttura non solo per caratterizzare un oggetto astratto, ma anche per descrivere un insieme di bit che potrebbe essere letto da una directory.

La sezione sta ampiamente discutendo di come questa idea abbia portato all'introduzione della "matrice < -> equivalenza del puntatore". Tuttavia, parla alla natura di basso livello di C (a struct rappresenta una "raccolta di bit").

Al contrario, C++ utilizza un struct come un tipo di sinonimo per class, ma dove tutto è pubblico. Un class è davvero un concetto di programmazione orientata agli oggetti in cui è più naturale che il suo tag sia trattato come un tipo.

Problemi correlati