【问题标题】:Difference between char * and LPSTR in windowswindows中char *和LPSTR的区别
【发布时间】:2012-08-10 08:55:57
【问题描述】:

如果这是一个基本或愚蠢的问题,我深表歉意。 char*LPSTR 有什么区别。 sizeof 在我的编译器中都给出了 4 个字节。有人可以详细解释我。谢谢。。

【问题讨论】:

  • typedef CHAR *LPSTR;, typedef char CHAR;。你需要知道的关于这些东西on this page.
  • @chris 感谢您的回复,但需要使用 LPSTR 而不是使用 char * ?
  • 正如答案所说,这纯粹是历史性的。
  • 感谢您的所有回答都赞成......

标签: c windows winapi visual-c++


【解决方案1】:

LPSTR 是一个 Windows 类型,意味着无论您在什么平台上编译都是一样的。它是一个指向字符串的长指针。

在分段架构(旧的 64K 分段,而不是新的基于选择器的分段内存)的时代,您有微型、小型、中型、大型和巨大的内存模型,重要的是 Windows 类型始终无论char * 是什么类型的指针,都一样。

因此,如果您遵循底层类型不同的不同编译器,windows.h 头文件将定义 LPSTR 来弥补这一点。

例如,Borland C 可能有一个 16 位的 char *,而 LPSTR 可能必须为它定义为 far char *。在char * 已经是一个长/远指针的编译器中,LPSTR 会直接使用它。

如今,对于 32 位以上的平面模型,可能没有真正需要这种恶作剧,尽管它可能仍然会发生在 64 位和 32 位代码之间转换之类的事情。尽管如此,那里定义的类型仍然存在,并且仍在大量使用中。

【讨论】:

  • 对此的一个小说明.. 我的理解是,在 32 位和 64 位机器中,LPSTR、PSTR 和 Char * 都是相同的,可以互换使用吗?如果我错了,请纠正我..
  • @user1317084:不知道,这真的没关系。您应该使用原型使用的类型。即使这三种类型已经融合为一种,也不能保证将来仍然如此。我要特别注意的是从 64 位代码调用 32 位 DLL(例如)(因此我的 thunking 注释)。使用 Windows API 告诉你使用的类型,然后你会知道你没事。
【解决方案2】:

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

来自WikiBooks

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

【讨论】:

  • 对此的一个小说明.. 我的理解是,在 32 位和 64 位机器中,LPSTR、PSTR 和 Char * 都是相同的,可以互换使用吗?如果我错了,请纠正我..
【解决方案3】:

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

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

【讨论】:

  • 对此的一个小说明.. 我的理解是,在 32 位和 64 位机器中,LPSTR、PSTR 和 Char * 都是相同的,可以互换使用吗?如果我错了,请纠正我..
  • 没错。 PSTR 的类型定义为“char *”,并且在所有架构上都是相同的。 LPSTR 的类型定义为“far char *”,因此在 32 位及更高版本上将是相同的(因为 'far' 不再意味着任何东西)。它们可以互换使用,但您不太可能再看到使用“PSTR”的代码,并且您通常应该遵循您正在使用的代码的风格。
猜你喜欢
  • 2013-03-22
  • 2011-11-25
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2017-04-02
  • 2014-10-28
  • 2011-12-14
相关资源
最近更新 更多