В чем преимущество typedef типа для указателя?Разве это не сбивает с толку?
Обычно модулям / библиотекам необходимо поддерживать некоторое внутреннее состояние для их правильного функционирования.Это внутреннее состояние должно быть прочитано / проверено на каждом API, который вызывается для этого модуля / библиотеки.Таким образом, пользователь модуля должен передавать эту информацию каждому API, который они вызывают.Но разработчик библиотеки не хочет, чтобы пользователи библиотеки могли видеть содержимое этого поддерживаемого состояния, потому что, если им позволено, кто-то может разыграть или сделать честную попытку изменить состояние, и результаты этого могутбыть радикальным для модуля.Чтобы избежать такого сценария, модули маскируют свои переменные поддержания состояния как void*
, так что теперь он непрозрачен (его содержимое не видно) для пользователей модуля.Для того, чтобы пользователи не смущались использованием void *
, они обычно вводят определение void *
как HANDLE
, это для простоты использования для клиентов модуля / библиотеки.
Что касаетсяупомянутый код:
typedef void *PVOID,*LPVOID;
означает, где бы вы ни упоминали PVOID
, далее он будет рассматриваться как тип void *
.
Таким образом,
typedef PVOID HANDLE;
эквивалентен:
typedef void *HANDLE;
Потому что PVOID
- это не что иное, как void *
.