'typedef' to potężne narzędzie do tworzenia nowych nazw (aliasów) typów, co sprawia, że kod jest krótszy i łatwiejszy w utrzymaniu oraz zrozumieniu. Słowo kluczowe pojawiło się we wczesnych wersjach C, upraszczając życie programistom dużych projektów, gdy długie deklaracje struktur i wskaźników czyniły kod nieczytelnym i trudnym do utrzymania.
Początkowo struktury i unie definiowane były za pomocą długich deklaracji z użyciem słowa kluczowego struct, union, enum. Wraz ze wzrostem kodu takie deklaracje stały się zbędne i niewygodne, co doprowadziło do wprowadzenia typedef — celem skrócenia i ustandaryzowania typów.
Typowe błędy związane są z niewłaściwym rozumieniem aliasów, myleniem typedef z deklaracją struktur, anonimowymi strukturami, trudnościami z tablicami wskaźników i niedokumentowanymi konwencjami nazewnictwa.
'typedef' pozwala nadawać krótkie nazwy istniejącym typom — zarówno podstawowym, jak i złożonym:
Przykład kodu:
typedef struct Point { int x, y; } Point; Point p1; // zamiast 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
Kluczowe cechy:
1. Czy można stworzyć za pomocą typedef „nowy typ”, który byłby niespójny z typem podstawowym (np. int)?
Nie. typedef jedynie daje alias. Typ na poziomie kompilatora pozostaje taki sam, rzutowanie jest możliwe bez błędów kompilacji.
2. Jeśli zadeklaruję typedef struct {} name_t;, a następnie struct name_t var;, jaki jest wynik?
To błąd! Po typedef struct MyStruct { ... } Name;, używa się Name do zmiennych, a nie struct Name. struct Name nie jest znany kompilatorowi — tak to nie działa.
3. typedef int arr[10]; arr a,b; Jaki jest typ a i b?
a i b to obie tablice int o długości 10. To nie są wskaźniki! Błąd — oczekiwanie 'int* a, b', jeśli zapomnieć o szczególności typedef z tablicami i wskaźnikami.
W projekcie ogłasza się typedef struct User { ... } User;, ale używa struct User my_user; — kompilator narzeka, kod niewykonalny.
Zalety:
Wady:
W całym projekcie przestrzega się jednego standardu: typedef struct {...} Name;, używają tylko Name var; bez struct.
Zalety:
Wady: