2010-12-12 32 views
13

stary znajomy:C++ crazy typedef: jaki jest sens dopuszczenia tej składni przez Standard?

typedef int cute_int; //cute : common and familiar syntax. 

Ta składnia jest doskonały. Nie ma problemu.

Teraz, kiedy możemy napisać typedefs jak powyżej, to co jest punktem pozwalając tej składni:

int typedef crazy_int; //crazy : uncommon and unfamiliar syntax. 

Wystarczy pomylić programistów? Czy ta składnia jest potrzebna wszędzie (kiedy w rzeczywistości mamy poprzednią)? Co myślisz z punktu widzenia kompilatorów? Czy uważają to za słodkie czy zwariowane? Czy to nie ma znaczenia dla kompilatorów?


Nawiasem mówiąc, ten kod pochodzi tutaj: Use of typename keyword with typedef and new

W przypadku, gdy zastanawiasz się, czy to jest błąd składni, a następnie sprawdzić the working code here na ideone.

+4

C++/C zostały zaprojektowane tak, aby zmylić programistów. Był to wyraźny cel projektowy, aby zmaksymalizować złożoność wyrażeń, które można napisać - do góry nogami można pisać szaleńczo skomplikowany kod na wiele różnych sposobów - wadą jest to, że można pisać szaleńczo skomplikowany kod na wiele różnych sposobów. –

+4

@James, jeśli chcesz zobaczyć język, który maksymalizuje złożoność wyrażeń, powinieneś nauczyć się perla. – SoapBox

+1

Naprawdę nie sądzę, że kompilatory mają jakąkolwiek koncepcję słodkiego lub zwariowanego ... to jest tam świat GIGO. – BoltClock

Odpowiedz

10
+3

Więc w zasadzie to szaleństwo pochodzi od C! – Nawaz

+0

Nawiasem mówiąc, nawet jeśli pochodzi z C, to nie powoduje, że wiele składni jest mniej szalonych! – Nawaz

0

Nie jestem pewien, czy jest to dozwolone przez standard. Ale jak wiemy, w języku C++ jest wiele rzeczy, które pozwalają, ale mają składnię ilogiczną. Na przykład tego rodzaju rzeczy 1[a], "hello"[2];// ...

+2

, które mogą mieć trochę wyjaśnienia, jeśli myślisz wzdłuż tej linii: a [1] => * (a + 1) => * (1 + a) => 1 [za]. – Nawaz

+1

Ten jest bardzo podobny do adresowania asemblera, więc nie jest tak nielogiczny. –

1

I nie był świadomy tej składni, choć mój g ++ wydaje się to zaakceptować ... ale z punktu widzenia kompilatora, to sprawia, że ​​rzeczy trudniejsze parsowania: kiedy wystąpi int tokena, ty don „t wiedzieć, czy jesteś parsowania definicji typu (a typedef ma się zdarzyć) lub jesteś parsowania definicji zmiennej/funkcja ...

jedyny sens to ma mieć A typedef B jest jeśli wziąć pod uwagę typedef być operatorem binarnym (w znaczeniu przypisania typu jako A = B).

+3

Wygląda na to, że 'typedef' jest w tym samym zbiorze, co słowo' const' (możesz napisać 'const int a' i' int const a'). –

+2

@Pawel: ten zestaw jest nazywany: "specyfikator decl" – ybungalobill

+1

To naprawdę nie sprawi, że parsowanie będzie "trudniejsze", o ile gramatyka jest jednoznaczna. – casablanca

10

Pytanie brzmi "? Dlaczego myli cię"

Składnia pochodzi z gramatyki deklaratorów deklaracji w C++, która jest bardzo ogólna i używana do wielu rzeczy w C++. Kolejność specyfikatorów deklaracji nie ma znaczenia. Spójrz na nich:

int virtual f() const, *g(int); 
int ptr1, *ptr2; 
int typedef const *name1, name2; 

Są równoważne:

virtual int f() const; 
virtual int* g(int); 
int ptr1; 
int *ptr2; 
typedef const int* name1; 
typedef const int name2; 

Jeśli spojrzeć na nich wystarczająco długo może się okazać, że składnia jest rzeczywiście jednolity i logiczny. Pomocne może być także zapoznanie się z gramatyką C++.

+2

@ybungalobill: Ten wpis jest dobry, jeśli chodzi o znajomość innej składni. ale pytanie pozostaje takie samo: dlaczego pozwolić na różne składnie, aby osiągnąć to samo? Prawdziwym problemem jest to, że myli programistów, która składnia jest "naprawdę" inna i naprawdę robi coś innego, i która składnia jest inna, ale robi to samo. Programiści muszą pamiętać, powiedzmy, 6 składni, które robią TYLKO 2 różne rzeczy! – Nawaz

+3

@Nawaz: Problem polega na tym, że uważasz te dwie formy za różne składnie, ale w rzeczywistości są one takie same. Mogę więc argumentować, że w ten sposób nie musisz pamiętać kolejności, która pojawia się po raz pierwszy 'inline',' const', 'friend' lub' int'. – ybungalobill

+0

@ybungalobill: jeśli napotykasz trudności w rozumieniu mojego komentarza, zamień słowo "składnia" na "formularze". Mam na myśli, że tak długo, jak istnieje więcej niż jedna forma, która robi dokładnie to samo, składnia jest myląca, ponieważ istnieje inny zestaw form, które robią coś innego. Wyobraź sobie, że masz 100 formularzy, które wykonują jedną rzecz, a kolejne 100 to te, które robią jedno. Te formularze są niepotrzebnie trudne! – Nawaz