2010-08-07 16 views
7

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); 

Odpowiedz

1

I będziemy zawsze trzeba używać wiersza kodu jak ten?
HINSTANCE hInstance = new HINSTANCE__;

Zwykle używasz wartości HINSTANCE zwróconej przez wywołanie systemowe systemu Windows; Nigdy nie widziałem kodu wykonującego taką linię.

10

Chodzi o to, że różne uchwyty mają różne typy, tak że na przykład HINSTANCE nie jest przypisane do UCHWYTU. Jeśli wszystkie zostały zdefiniowane jako "void *", istnieją klasy błędów, których kompilator nie mógł wykryć.

+0

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? –

+0

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

+0

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

0

Nie wskazują one nic na pamięć; są używane tylko do odwoływania się do obiektów (plików, zasobów, semaforów, okien) podczas nawiązywania połączeń z interfejsem API systemu Windows. Chociaż są one niczym innym, jak tylko indeksami do tabel obiektów jądra, twórcy zdecydowali, że tworzą wskaźnik do nieużywanej struktury, która uczyniłaby je "nieprzezroczystymi" i powodowałoby mniejsze zamieszanie między innymi typami. DECLARE_HANDLE to makro funkcyjne, które właśnie to robi - deklarujące typy nieprzezroczyste dla uchwytów.