2009-10-09 15 views
34

miałem natknąć się następujący kod:C typedef od wskaźnika do struktury

typedef struct { 
     double x; 
     double y; 
     double z; 
} *vector; 

Jest to ważna definicja typu? Kod kompiluje się i działa poprawnie. Byłem ciekawy, czy to powszechna praktyka.

Odpowiedz

51

Absolutnie ważne. Zazwyczaj można w pełni wykorzystać ten sposób definiując dwa typy razem:

typedef struct 
{ 
int a; 
int b; 
} S1, *S1PTR; 

Gdzie S1 struct i S1PTR jest wskaźnik do tej struktury.

+1

Wielkie dzięki, które ma sens. –

+0

... a może 'const * S1CPTR'. – alecov

+0

Po to, aby potwierdzić, że rozumiem. Jest to odpowiednik 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon

-2

tak ... oszczędza ci kłopotów z ciągłym wpisywaniem słowa "struct" za każdym razem, gdy deklarujesz strukturę wektorową lub wskaźnik do niej.

+1

Myślę, że pytanie musiało zrobić więcej z typem na * wektor niż po prostu wektor. –

2

To ważny, to, co robi, to nowy typ. Jak powiedział @Alex, przydatne byłoby zdefiniowanie typu i typu wskaźnika.

Można by stworzyć więcej wskazówek tylko za pomocą

S1PTR ptr1, ptr2, ptr3, ...; 

zamiast

S1 *ptr1, *ptr2, *ptr3, ...; 
3

Tak to jest ważne. Jeśli potrzebujesz więcej „bezpieczeństwo” można też zrobić

typedef struct vector_{ 
     double x; 
     double y; 
     double z; 
} *vector; 

następnie można użyć zarówno

struct vector_ *var; 
vector var; 

Ale nie zapomnij końcowy średnik.

Używanie tylko typedef oznacza, że ​​nazywasz to w ten sposób. w przeciwnym razie byłaby mniej lub bardziej anonimowa.

+1

Sądzę, że możesz użyć tej samej nazwy dla obu (tzn. Nie potrzebujesz podkreślenia, ale możesz zostawić wszystko inne w kodzie tak samo, ponieważ przestrzenie nazw są oddzielne). – RastaJedi

1

Tak, jest ważny jak opisano w powyższych odpowiedziach. Mała sugestia, byłoby lepiej, jeśli podasz nazwę tagu również, jak następuje. Pomoże to niektórym środowiskom IDE lepiej przeanalizować kod.

typedef struct vactor_tag { 
     double x; 
     double y; 
     double z; 
} *vector; 
24

Tak jest. Ale jest to zły styl. Nie bezpośrednia deklaracja struktury, ale bezpośrednia deklaracja typu wskaźnika. Jest to obfuskacja, informacja, że ​​dana zmienna lub parametr jest wskaźnikiem (i w mniejszym stopniu dla tablic) jest niezwykle istotna, gdy chcemy przeczytać kod.

Podczas przeglądania kodu często trudno jest zauważyć na pierwszy rzut oka, która funkcja może wywoływać efekt uboczny. Jeśli użyte typy ukryją tę informację, dodaje ona do czytelnika obciążenie związane z zapamiętywaniem.

int do_fancy(vector a, vector b); 

lub

int do_fancy(vector *a, vector *b); 

w pierwszym przypadku można łatwo przegapić, że funkcja może zmienić treść a lub b. W drugim jestem ostrzeżony.

A kiedy faktycznie piszę kod, wiem również bezpośrednio, aby napisać a->x i nie chcę, aby kompilator powiedział mi "coś", a nie strukturę lub związek ".

Wiem, wygląda to na osobisty gust, ale pracując z dużą ilością kodu zewnętrznego, mogę zapewnić, że jest to bardzo irytujące, gdy nie rozpoznajesz poziomu zmiennych w kierunku pośrednim. Jest to jeden z powodów, dla których nie lubię referencji w C++: (w Javie nie chodzi o to, że wszystkie obiekty są przekazywane przez odniesienie, są spójne) i typu Microsoftu LPCSTR.

+6

+1 dla obserwacji, że 'typedef struct {...} * obj' prowadzi do typu, który w tajemniczy sposób wymaga' -> 'zamiast' .' dla dostępu do elementu. – Michael

Powiązane problemy