typedef тип для указателя - PullRequest
       5

typedef тип для указателя

4 голосов
/ 01 ноября 2011

Итак, обычно мы печатаемdef к другому указателю типа или функции, но typedef для указателя типа является странным для меня.Например, в winnt.h мы получили:

typedef void *HANDLE;
typedef PVOID HANDLE;

и PVOID:

typedef void *PVOID,*LPVOID;

В соответствии с этим в первом утверждении это должно быть * HANDLE, потому что это указатель наvoid, в то время как PVOID уже является указателем на void, поэтому его не нужно объявлять как указатель.

Однако в чем преимущество typedef типа для указателя?Разве это не более запутанно?

Ответы [ 3 ]

6 голосов
/ 01 ноября 2011

В чем преимущество typedef типа для указателя?Разве это не сбивает с толку?

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

Что касаетсяупомянутый код:

typedef void *PVOID,*LPVOID;

означает, где бы вы ни упоминали PVOID, далее он будет рассматриваться как тип void *.
Таким образом,

typedef PVOID HANDLE; 

эквивалентен:

typedef void *HANDLE; 

Потому что PVOID - это не что иное, как void *.

2 голосов
/ 01 ноября 2011

И если вам интересно, зачем использовать 2 typedef для одного и того же значения, ответ таков: они имеют разное значение и варианты использования.HANDLE - дескриптор объекта, а PVOID - просто указатель на любой тип.Так что это просто для лучшей читабельности.

0 голосов
/ 01 ноября 2011

говоря по-английски,

typedef void *PVOID

означает использование void * вместо PVOID.&

typedef PVOID HANDLE;

означает использование PVOID вместо HANDLE, и из-за нашего предыдущего определения типа это дополнительно означает использование void * вместо HANDLE

, это для лучшей читаемости кода.

...