Можно ли использовать 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;