2011-11-18 12 views
6

Jaki jest powód, dla którego typedefs nie jest silnie wpisany? Czy są jakieś zalety, których nie widzę, czy jest to spowodowane kompatybilnością wsteczną? Zobacz poniższy przykład:Dlaczego typedefs nie jest silnie wpisany?

typedef int Velocity; 
void foo(Velocity v) { 
    //do anything; 
} 
int main() { 
    int i=4; 
    foo(i); //Should result in compile error if strongly typed. 
    return 0; 
} 

Nie pytam dla obejścia, aby uzyskać silny typ danych wpisywanych ale tylko chcę wiedzieć, dlaczego średnia nie jest wymagająca typedefs być silnie wpisane?

Dziękuję.

+3

Ponieważ C jest językiem dla ludzi, którzy chcą osiągnąć cel, a nie dla ludzi, którzy chcą zastanowić się nad matematycznym pięknem abstrakcyjnych systemów typów. (Jako ktoś, kto docenia obie te czynności, nie oceniam żadnego z nich). –

+3

@Stephen Canon: Kto powiedział, że systemy typu abstrakcyjnego nie mogą Ci pomóc w osiągnięciu celu? Debugowanie błędów runtime, które wynikają z przypadkowo niewłaściwie używanych typów, z pewnością nie liczy się jako Getting Things Done w mojej książce. –

+0

@MichaelBorgwardt: Na pewno nie powiedziałem, że nie mogą. Jednak * mogą * być wykorzystywane. –

Odpowiedz

14

Ponieważ C nie jest silnie wpisany i typedef ma swoje źródło w tym myślenia

typedef jest tylko dla wygody i czytelności, to nie tworzy nowego typu.

4

typedef jest po prostu missnomer (jak wiele innych słów kluczowych). Pomyśl o tym jako o typealias.

C ma wręcz przeciwne pojęcie o tym, jakie są kompatybilne typy. Pozwala to na przykład na łączenie ze sobą jednostek kompilacji, nawet jeśli deklaracje prototypów funkcji są wykonywane tylko w zgodnych typach, a nie w identycznych. Wszystko to wynika z prostej praktycznej konieczności w codziennym życiu, wciąż będąc w stanie dać pewne gwarancje realizacji.

+2

To nie jest główna idea C "To wszystko tylko bity, nie ukrywajmy tego zbyt wiele"? –

+1

@MichaelBorgwardt, nie, nie sądzę. W przeciwnym razie nie miałby tego szczegółowego modelu zgodnych typów. –

0

Nawet jeśli Velocity był odrębnym typem od , Twój kod byłby kompilowany i działał poprawnie z powodu reguł konwersji typu. To, co by nie działało, to przekazanie wyrażenia typu Velocity * do funkcji oczekiwanej int * itp. Jeśli chcesz osiągnąć drugą formę wymuszania typów, po prostu uczyń Velocity strukturą lub typem związku zawierającym jedną liczbę całkowitą, a teraz będziesz mieć nowy prawdziwy typ.

Powiązane problemy