Тестирование на недопустимый дескриптор окна: нужно ли сравнивать с «NULL», «0» или даже с «nullptr»? - PullRequest
13 голосов
/ 11 октября 2010

Я исходил из фона, в котором указатели, как правило, следует сравнивать с «NULL», а целые числа с «0».

Поскольку я не воспринимал дескрипторы Windows как «указатели» в чистом смысле(будучи «дескрипторами»), я привык сравнивать их с 0, а не с «NULL».

Ясно, что в настоящее время они реализованы внутри как указатели, но я лично считаю, что это просто дляприобретая некоторую безопасность типов, а не потому, что они по сути являются указателями.

В любом случае, я просто заметил, что справка для CreateIC, которая возвращает HDC, гласит, что если функция завершается ошибкой, то она возвращает 'NULL'.1008 * Теперь я сбит с толку - и мне интересно, что считают другие люди - правильнее ли считать дескриптор Windows указателем (и, следовательно, проверять его на «NULL» или «nullptr» для современных компиляторов) или это должно быть так?считается целым числом?

Ответы [ 3 ]

8 голосов
/ 11 октября 2010

Сравните это с задокументированным возвращаемым значением ошибки.Это означает, что вы должны сравнить его с INVALID_HANDLE, 0, -1, ненулевым или <=32 (я не шучу с последним, см. ShellExecute).

3 голосов
/ 11 октября 2010

Чтобы ответить на ваш вопрос: тип HANDLE объявлен в winnt.h как

typedef PVOID HANDLE;

Следовательно, технически это указатель.

Однако я бы просто использовал все, что угоднозадокументировано;если в документации указано, что возвращается NULL, я использую именно это, если нет свидетельств того, что документация неверна.

Я даже не думаю о указателях или целых числах.NULL - это просто непрозрачное значение (в этой ситуации), а HANDLE - это непрозрачный тип для меня, и я не потрудился посмотреть, к чему это #define 'd.

1 голос
/ 11 октября 2010

Я думаю, что INVALID_HANDLE_VALUE обычно является правильным 'недопустимым' значением для дескрипторов окон ... и оно оценивается как -1.

...