Strona główna | Język C++ | C++ Builder | Programy | Narzędzia | Forum | Księga gości | Sznurki | Kontakt
Nazywanie typów danych
Tworząc własny typ: strukturę czy klasę możemy przypisać tylko jeden identyfikator, za pomocą którego będziemy deklarować zmienne. Aby utworzyć alternatywne nazwy dla danego typu należy (najlepiej w pliku nagłówkowym) użyć instrukcji typedef o składni:
typedef typ identyfikator;
Np. aby stworzyć alias na unsigned int o nazwie UINT (BTW który istnieje już w API) należałoby napisać:
typedef unsigned int UINT;
Teraz kod:
unsigned int liczba;
jest równoważny
UINT liczba;
Niedozwolone jest łączenie naszego identyfilatora z innymi słowami kluczowymi. Np.
typedef long int DużaLiczba;unsigned DużaLiczba liczba; // dodatkowa specjalizacja == błąd
typedef i struktury
Instrukcję typedef można używać w podobny sposób także ze strukturami i klasami:
struct NaszaStruktura{ int Pole1; int Pole2;};typedef NaszaStruktura InnaNazwa;
Definicję struktury i nazwanie typu można połączyć w jedną instrukcję. Np.
typedef struct NaszaStruktura{ int Pole1; int Pole2;} InnaNazwa, *lpInnaNazwa;
W powyższym przykładzie zarejestrowałem także osobny identyfikator dla wskaźnikowej wersji naszej struktury. Zadeklarujmy teraz zmienną typu lpInnaNazwa i wskaźnik na typ InnaNazwa.
lpInnaNazwa zmienna1;InnaNazwa * zmienna2;
Zauważ, że w pierwszej linijce nie ma gwiazdki i jest zadeklarowana zmienna o typie lpInnaNazwa. Na pierwszy rzut oka zmienna1 nie jest wskaźnikiem, ale przy próbie odwołania się do pól struktury poprzez kropkę ujrzymy błąd. Sęk w tym, że pod identyfikatorem lpInnaNazwa kryje się NaszaStruktura *. Wynika z tego, że zmienna1 jest tego samego typu co zmienna2. Takie aliasowanie spotykamy na każdym kroku w Windows API.
Wskaźniki na funkcje
Każdy doświadczony programista wie jak nieporęczne jest deklarowanie i rzutowanie wskaźników do funkcji. Jeśli funkcja ma deklarację:
int __fastcall sendbuf(TCustomWinSocket * Socket, void * buffer, unsigned int len);
to deklaracja wskaźnika na taki typ wyglądałaby mniej więcej tak:
int (__fastcall * fsendbuf)(TCustomWinSocket * , void *, unsigned int);
Zadeklaruj kilka róźnych wskaźników w ten sposób... Koszmar, co? Sprawę można uprościć rejestrując osobny identyfikator na naszą metodę:
typedef int (__fastcall * fsendbuf_proc)(TCustomWinSocket*, void*, unsigned int);
Teraz, aby zadeklarować wskażnik na funkcję o takim nagłówku wystarczy napisać dwa słowa:
fsendbuf_proc funkcja;
Takie rozwiązanie jest szczególnie przydatne gdy korzystasz z bibliotek DLL przy użyciu standardowych rozwiązań Windows API i pobierasz adresy funkcji poprzez GetProcAddress().