Можно ли использовать void*
вместо LPVOID
в C?
Или LPVOID
выполняют некоторые специальные функции, чем void*
.
Можно ли использовать void*
вместо LPVOID
в C?
Или LPVOID
выполняют некоторые специальные функции, чем void*
.
В C нет типа LPVOID
, это вещь Windows.
И причина, по которой такие вещи существуют, заключается в том, что базовые типы могут меняться от выпуска до выпуска, не затрагивая ваш исходный код.
Например, допустим, что ранние версии компилятора Microsoft C имели 16-разрядный int
и 32-разрядный long
. Они могут просто использовать:
typedef long INT32
и, voila, у вас есть 32-разрядный целочисленный тип.
Теперь отпустите несколько лет назад, когда Microsoft C использует 32-разрядный int
и 64-разрядный long
. Для правильной работы функции исходного кода они просто меняют строку typedef
следующим образом:
typedef int INT32
Это отличается от того, что вам нужно было бы сделать, если бы вы использовали long
для 32-разрядных целочисленных типов. Вам придется пройти весь исходный код и убедиться, что вы изменили свои собственные определения.
Это гораздо чище с точки зрения совместимости (совместимость между различными версиями Windows) с использованием типов данных Microsoft.
В ответ на ваш конкретный вопрос, вероятно, можно использовать void*
вместо LPVOID
, если не будет изменено определение LPVOID
.
Но я бы не стал, на всякий случай. Вы никогда не знаете, сможет ли Microsoft ввести другой способ обработки общих указателей в будущем, который изменит определение LPVOID
. Вы действительно ничего не теряете, используя тип Microsoft, но в будущем вам может потребоваться выполнить некоторую работу, если они изменят определение, и вы решили использовать базовый тип.
Вы не можете думать, что указатели не будут защищены от такого рода изменений, но в оригинальные 8088 дней, когда была создана Windows, были все виды странности с указателями и моделями памяти (крошечные, маленькие, большие, огромные и др.), что позволило указателям иметь разные размеры даже в пределах одной и той же среды.
LPVOID
- это просто API Windows typedef
для void*
.
LPVOID
typedef void* LPVOID
определенный в Windef.h
, где определены все типы данных Windows.
Мы можем использовать void * для указания любого типа.
LPVOID - это указатель на любой тип. Этот тип объявляется в WinDef.h следующим образом: typedef void * LPVOID;