2010-10-11 7 views
10

Pochodzę z tła, w którym wskaźniki powinny być zasadniczo porównywane z "NULL" i liczbami całkowitymi z "0".Testowanie nieprawidłowego uchwytu okna: czy powinienem porównać z "NULL", "0" lub nawet "nullptr"?

Ponieważ nie postrzegałem uchwytów Windows jako "wskaźników" w czystym tego słowa znaczeniu (będących "uchwytami"), nabrałem nawyku porównywania ich z 0, a nie "NULL".

Najwyraźniej są one obecnie wdrażane wewnętrznie jako wskaźniki, ale osobiście uważam, że są one przeznaczone jedynie do uzyskania pewnego rodzaju bezpieczeństwa, a nie dlatego, że są wewnętrznie wskazówkami.

W każdym razie zauważyłem, że pomoc dla CreateIC, która zwraca kod HDC, stwierdza, że ​​w przypadku niepowodzenia funkcji zwróci wartość "NULL".

Teraz jestem zdezorientowany - i zastanawiam się, co inni ludzie sądzą - czy bardziej słuszne wydaje się rozważenie uchwytu systemu Windows jako wskaźnika (a zatem sprawdzenie go pod kątem "NULL" lub "nullptr" dla współczesnych kompilatorów) lub należy uznać, że jest liczbą całkowitą?

+0

Uchwyty nie są wskaźnikami, ale indeksami do tabeli. Sprawdź MSDN pod kątem wartości zwracanych. W każdym razie, dlaczego 'if (x) {..' nie jest dobre? – ruslik

+1

Dzięki za to - zadzwoń do mnie staromodny, ale zwykle rezerwuję notację "if (x)" dla wyrażeń, które oceniają wyniki "bool". Nie wiem, czy to dobra czy zła praktyka, ale do tego jestem przyzwyczajony. –

Odpowiedz

8

Porównaj to z udokumentowaną wartością zwracaną błędu. Oznacza to, że powinieneś porównać to z INVALID_HANDLE, 0, -1, niezerowym lub <=32 (nie żartuję z ostatnim, zobacz ShellExecute).

+1

Dzięki za tę odpowiedź - myślę, że masz rację, nie ma dużej spójności i powinienem robić to, co mówi mi MSDN. –

1

Wydaje mi się, że INVALID_HANDLE_VALUE jest zazwyczaj prawidłową "nieprawidłową" wartością dla uchwytów Windows ... i która ocenia się na -1.

+4

To nie zawsze prawda. Zależy to od tego, do którego interfejsu API dzwonisz ... co jest OGROMNYM bólem :( – Goz

+0

Jeśli wykonasz: 'HWND hwnd = INVALID_HANDLE_VALUE' otrzymasz błąd czasu kompilacji, co wydaje mi się dziwne –

3

Aby odpowiedzieć na to pytanie: typ HANDLE jest zadeklarowana w WINNT.H jak

typedef PVOID HANDLE; 

Stąd technicznie jest to wskazówka.

Jednak użyłbym tylko tego, co jest udokumentowane; jeśli dokumentacja stwierdza, że ​​zwracana jest nazwa NULL, używam jej dokładnie, chyba że dowody wskazują, że dokumentacja jest nieprawidłowa.

Nie myślę nawet o wskaźnikach w stosunku do liczb całkowitych. NULL jest po prostu nieprzezroczystą wartością (w tej sytuacji) i HANDLE jest dla mnie nieprzejrzystym typem i nie zadaję sobie trudu sprawdzenia, co to jest #define.

Powiązane problemy