Windows中char*和LPSTR之间的区别

2vi*_*on2 16 c windows winapi visual-c++

如果这是一个基本或愚蠢的问题,我道歉.char*和之间有什么区别LPSTR.其中sizeof既给出了我的编译器4个字节.有人可以详细解释我.谢谢..

pax*_*blo 20

LPSTR是一种Windows类型,无论您正在编译什么平台,都应该是相同的.它是一个指向字符串的长指针.

回到分段架构(旧的64K段,而不是新的基于选择器的分段存储器)的时代,你有小型,小型,中型,大型和大型内存模型,重要的是Windows类型始终是相同的,无论指针char *是什么类型.

因此,如果您遵循底层类型不同的不同编译器,则windows.h头文件将定义LPSTR以补偿它.

例如,Borland C可能有16位char *,LPSTR可能必须定义far char *它.在char *已经是长/远指针的编译器中,LPSTR将使用它.

如今,使用32位以上的平面模型,可能没有真正需要这样的恶作剧,尽管它可能仍然发生在诸如64位和32位代码之间的thunking之类的事情上.尽管如此,那里定义的类型仍然存在,但仍在使用中.

  • @ user1317084:不知道,这真的没关系.你_should_正在使用原型使用的类型.即使这三种类型已经融合为一种,也不能保证将来会如此.特别需要注意的是从64位代码调用的32位DLL(例如我的thunking注释).使用Windows API告诉您使用的类型,然后您将_know_您没问题. (3认同)

Stu*_*tLC 7

基本上,LP*指针指示在16位版本的Windows上使用32位指针:

来自WikiBooks

字母"LP"或前缀"lp"代表"长指针",它与32位机器上的常规指针完全相同.当需要区分指针和长指针时,LP数据对象只是从Windows 3.1或更高版本中传承的遗留对象.在现代32位系统上,这些前缀可以互换使用.


Mar*_*tin 5

差异被埋藏在时间的深处。LPSTR 代表“指向字符串的长指针”。回到 32 位处理器之前,指向可能位于不同内存段(想想,在内存中很远的地方)的内存的指针需要额外的空间来存储。

在 32 位(及更高版本)处理器上,它们完全相同。Microsoft 仅出于历史原因使用 LPSTR。