LPVOID和void之间的区别*

Sid*_*qui 41 c

我可以用void*而不是LPVOID用C吗?

或者LPVOID执行一些特殊的功能void*.

pax*_*blo 90

LPVOIDC中没有类型,它是Windows的东西.

这些东西存在的原因是底层类型可以在不影响源代码的情况下从发行版更改为发布版.

例如,假设早期版本的Microsoft C编译器有16位int和32位long.他们可以简单地使用:

typedef long INT32
Run Code Online (Sandbox Code Playgroud)

瞧,你有32位整数类型.

现在让我们继续前进几年,直到Microsoft C使用32位int和64位long.为了使源代码功能正常,他们只需将typedef行更改为:

typedef int INT32
Run Code Online (Sandbox Code Playgroud)

这与您long用于32位整数类型时必须执行的操作形成对比.您必须浏览所有源代码并确保更改自己的定义.

从兼容性角度(不同版本的Windows之间的兼容性)来使用Microsoft的数据类型更清晰.

在回答您的具体问题时,可能可以使用void*而不是LPVOID 提供 预期不会改变的定义LPVOID .

但我不会,以防万一.你永远不知道微软是否会在未来引入一些不同的处理通用指针的方式来改变它的定义LPVOID.使用Microsoft的类型并没有真正丢失任何东西,但如果他们更改定义并且您决定使用基础类型,则可能需要在将来做一些工作.

您可能认为指针不会受到这种变化的影响,但是,在创建Windows的最初8088天,指针和内存模型(微小,小,大,巨大等)都存在各种奇怪现象,这些指针允许指针即使在相同的环境中也具有不同的尺寸.


Meh*_*ari 11

LPVOID简直就是一个Windows API typedefvoid*.

  • @Todd:Naw.Windows开发人员认为他们必须拥有所有系统调用参数的SHOUTing类型. (7认同)
  • 回到16位8086,长(远)指针和短(近)指针是不同的:前者是段+偏移的32位值,后者是偏移的16位值(因此只能指向在同一部分内).如今,长指针和任何其他类型的指针之间没有区别. (5认同)
  • "长/短指针"具有误导性("远/近"更清晰); 它与指向的数据无关,而是与指针表示无关.具有分段寻址的16位系统可以访问超过2 ^ 16字节的地址空间,但是如果没有段前缀,则无法访问当前段之外的任何内容.x86-32和x86-64使用平面寻址(PAE很奇怪,sorta给你更长的物理地址,但虚拟地址仍然是32位),所以这不再相关,但命名是用Win16建立的. (2认同)