2013-03-25 11 views
5

Ciekawi mnie motywacja do tego zachowania w C. Czy był to celowy czy wypadek?Dlaczego znaczniki struct nie są nazwami typów w C?

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

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

Chcę wiedzieć, dlaczego Ritchie lub standardowa komisja wybrały to zachowanie.

+1

Jest mało prawdopodobne, aby Dennis Ritchie mógł odpowiedzieć na twoje pytanie ... Jeśli odpowiedzi nie ma w dokumencie "Uzasadnienie" (http://www.open-std.org/jtc1/sc22/wg14/ www/C99RationaleV5.10.pdf), wtedy to pytanie prawdopodobnie nie jest odpowiedzialne ... –

+0

Myślę, że przekonasz się, że 'struct tag' poprzedza' typedef' przez kilka lat, a potem wszystko zależy od zgodności wstecznej . C++ zrobił to, co chcesz. Spróbuj polować na "Primeval C". Mam plik tar "v6root.tar", który zawiera źródło z mnóstwem 'struct', ale nie zawiera w sobie' typedef'. To powinien być kod źródłowy Unix V6. Unix V7 miał 'typedef'. –

+0

Najbardziej oczywistym powodem jest to, że po prostu 'struct' i' union', język był wciąż wolny od kontekstu - dopiero w późniejszym dodaniu 'typedef' język C wymagał parser kontekstowego. – caf

Odpowiedz

4

Jest to rzecz o przestrzeni nazw. W ten sposób mogę mieć struct a, enum a, union a i żadna z nich nie jest dwuznaczna. Pomaga przy projektowaniu struktur, które mogą mieć podobne nazwy, ale może szybko się mylić.

+0

Ale chcę wiedzieć, dlaczego standardowa komisja lub Dennis Ritchie wybrali to zachowanie. – Rayniery

+1

To prawda, ale nie wiem, czy to jest ostateczna odpowiedź, czy pierwotne uzasadnienie decyzji podjętej przez panów Kernighana i Ritchiego. –

+1

@Rayniery nikt z nas nimi nie jest - nie możemy powiedzieć, co myśleli, kiedy zaprojektowali język. Możemy tylko spekulować, a spekulacja nigdy nie prowadzi do niczego dobrego. –

0

Po przeczytaniu The Development of the C Language, kiedy Dennis Ritchie omawia embrionalnych C opisuje swoją intencję na struct:

Chciałem strukturę nie tylko do scharakteryzowania abstrakcyjny obiekt, ale także opisać zbiór bitów można odczytać z katalogu.

Sekcja w dużej mierze omawia, w jaki sposób pomysł ten doprowadził do wprowadzenia "tablicy < -> równoważności wskaźnika". Mówi jednak do niskiego poziomu C (struct reprezentuje "zbiór bitów").

W przeciwieństwie do C++ używa struct jako swego rodzaju synonimu dla class, ale gdzie wszystko jest publiczne. A class jest tak naprawdę pojęciem programowania obiektowego, w którym bardziej naturalne jest traktowanie jego znacznika jako typu.

Powiązane problemy