Это восходит к началу девяностых назад, когда там был только HANDLE как тип объявить дескриптор любого объекта Windows. Который был фабрикой ошибок, программисты могли перепутать код и, скажем, передать дескриптор шрифта, где был нужен дескриптор окна. Итак, макрос STRICT был добавлен позже, он обновил типы дескрипторов, поэтому микширование создает ошибку компилятора. Что выглядит в winnt.h, отредактированы для содержания:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
Пример использования:
DECLARE_HANDLE(HWND);
структура макро суп гарантирует, что HFONT никогда не может быть использован, когда HWND, как ожидается, когда STRICT является включен, он создает несоответствие типа для типа структуры.
Теперь вы можете видеть, откуда «неиспользуемый». Он фактически не используется, только Windows может создавать значения дескриптора. Это полезно в отладчике, так как оно позволяет вам взглянуть на значение дескриптора, причем 0 или -1 являются верным признаком проблемы.
Подробнее о STRICT в this MSDN article.
Можете ли вы добавить некоторые сведения о 0 и -1, какие проблемы это может означать? В моем случае я иногда вижу вопросительные знаки, иногда 0, иногда другие числа. – ST3
+1 для объяснения о STRICT. также хотите узнать больше о «с 0 или -1, являющимся верным знаком проблемы». –
Это значение «не ручка», указывающее, что любая функция winapi, которую вы использовали, не удалась, и вы забыли проверить наличие ошибок. –