Подтвердить что ты не робот

Разница между LPVOID и void *

Можно ли использовать void* вместо LPVOID в C?

Или LPVOID выполняют некоторые специальные функции, чем void*.

4b9b3361

Ответ 1

В 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, были все виды странности с указателями и моделями памяти (крошечные, маленькие, большие, огромные и др.), что позволило указателям иметь разные размеры даже в пределах одной и той же среды.

Ответ 2

LPVOID - это просто API Windows typedef для void*.

Ответ 3

LPVOID

typedef void* LPVOID

определенный в Windef.h, где определены все типы данных Windows.

Мы можем использовать void * для указания любого типа.

Ответ 4

LPVOID - это указатель на любой тип. Этот тип объявляется в WinDef.h следующим образом: typedef void * LPVOID;