Что означает эта строка препроцессора C / C ++? - PullRequest
8 голосов
/ 07 августа 2010

Это строка 519 WinNT.h (версия для сборки: 0091)

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

Зачем нам нужен указатель на структуру с одним членом типа int со странным именем с именем 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);

Ответы [ 3 ]

11 голосов
/ 07 августа 2010

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

1 голос
/ 20 сентября 2016

Они на самом деле ничего не указывают на память;они просто используются для ссылки на объекты (файлы, ресурсы, семафоры, окна) при обращении к API Windows.Хотя они являются не чем иным, как просто индексами в объектных таблицах ядра, разработчики решили, что они делают это указателем на неиспользуемую структуру, которая сделает их "непрозрачными" и вызовет меньше путаницы между другими типами.DECLARE_HANDLE - это макрос функции, который делает именно это - объявляет непрозрачные типы для дескрипторов.

1 голос
/ 07 августа 2010

И нужно ли нам когда-нибудь использовать такую ​​строку кода?
HINSTANCE hInstance = новый HINSTANCE __;

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

...