Jest to linia 519 od WinNT.h
(Build Wersja: 0091)Co oznacza ta linia preprocesora C/C++?
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
Dlaczego potrzebujemy wskaźnik do struktury z jednego int członka z dziwną nazwą zwanego unused
?
Czy będziemy musieli użyć linii kodu podobnej do tej?
HINSTANCE hInstance = new HINSTANCE__;
Ogólnie deklarowanie różnych typów danych o tych samych strukturach, nie ma dla mnie sensu. Jaki jest pomysł?
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HSPRITE);
DECLARE_HANDLE(HLSURF);
DECLARE_HANDLE(HSTR);
DECLARE_HANDLE(HTASK);
DECLARE_HANDLE(HWINSTA);
DECLARE_HANDLE(HKL);
Tak więc idea, która kryje się za tym, to posiadanie liczb całkowitych, które nie będą wykorzystywane do celów innych niż te, dla których zostały zadeklarowane? –
Tak, zapewnia to typ bezpieczeństwa dla typów uchwytów, więc pojawia się błąd podczas próby przekazania funkcji HINSTANCE do funkcji, która wymaga UCHWYTU, mimo że podstawowa struktura jest identyczna. (Ta odpowiedź miała być po prostu "tak", ale najwyraźniej nie była wystarczająco gadatliwa, dodano dodatkową gadatliwość.) – janm
ahhh Rozumiem, dlaczego C nie zezwala teraz na anonimowe struktury jako parametry funkcji; jeśli potraktuje anonimowe struktury jako równe identycznej strukturze z tą samą konfiguracją, sprawi, że C nie spowoduje błędów, aby ta sztuczka działała. Mimo to jestem prawie pewien, że pozwoliłoby to na bardziej elastyczny kod, ale przynajmniej jest ku temu powód. Wydaje się również wskazywać, że istnieje rzeczywisty kod polegający na tym, że wskaźniki są dokładnie wielkości int, w przeciwnym razie uchwyt mógłby się zepsuć, a wiele kodu musiałoby zostać przepisane. – Dmitry