Что делает эту строку среднего препроцессора C/C++?

Это - Строка 519 из WinNT.h (Версия сборки: 0091)

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

Почему нам нужен указатель на структуру с единственным международным участником со странным названным именем unused?

И мы должны будем когда-либо использовать строку кода как этот?

HINSTANCE hInstance = new HINSTANCE__;

В целом объявляя различные типы данных с теми же структурами, не имеет смысла мне. Какова идея позади этого?

DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HSPRITE);
DECLARE_HANDLE(HLSURF);
DECLARE_HANDLE(HSTR);
DECLARE_HANDLE(HTASK);
DECLARE_HANDLE(HWINSTA);
DECLARE_HANDLE(HKL);
10
задан David Weng 7 August 2010 в 07:23
поделиться

2 ответа

Дело в том, что разные дескрипторы должны иметь разные типы, так что, например, HINSTANCE нельзя назначить HANDLE. Если бы все они были определены как «void *», тогда есть классы ошибок, которые компилятор не смог бы обнаружить.

12
ответ дан 3 December 2019 в 23:10
поделиться

И понадобится ли нам когда-нибудь использовать строку кода, подобную этой?
HINSTANCE hInstance = new HINSTANCE__;

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

1
ответ дан 3 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: