typy danych




[ Code Zone ] - Serwis programistyczny - C/C++





















  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().




WhiteRAVEN,
4.11.2001


Wyszukiwarka