【问题标题】:LPCSTR has no 'long' and UINT_PTR has no pointer?LPCSTR 没有“长”,UINT_PTR 没有指针?
【发布时间】:2014-05-09 15:04:31
【问题描述】:

在这个网站上:Windows Data Types

话题的问题出现了。

LP 代表我认为的长指针 - 但没有长指针。 UINT_PTR 代表我再次假设的无符号整数指针 - 但没有指针。

有人知道这件事的背景吗?

【问题讨论】:

  • 你的问题很矛盾。

标签: c++ c pointers msdn


【解决方案1】:

引用“长指针”(LP-types):

您曾经拥有long and short pointers 的时间(奔腾之前)。由于 WINAPI 在那个时代已经存在,并且今天仍然试图保持与那个时代的代码兼容,LPsomething-types 得以幸存。

转介UINT_PTR

这是一个足够宽的整数来保存指针的值。 C11-Standard 对这样的类型进行了如下定义:

7.20.1.4 能够保存对象指针的整数类型

1 以下类型指定一个有符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

  intptr_t

以下类型指定一个无符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

  uintptr_t

这些类型是可选的。

【讨论】:

  • 长指针来自 16 位时代,那时您有段:偏移内存寻址。长指针(又名远指针)包括段和偏移量。 Near 指针仅将偏移量包含在段中。这纯粹是英特尔 x86 架构的东西。
【解决方案2】:

UINT_PTR 不是指针类型。它是一个无符号整数类型,其宽度足以存储指针值(因此其宽度取决于目标平台)。它的存在是因为intunsigned int 的宽度不一定足以容纳一个指针(尤其是在x64 的Windows 上int 仍然是32 位而指针是64 位)。

【讨论】:

  • 不仅在 x64 上 int 是 32 位的。在某些平台上 long 仍然是 32 位,即使平台具有 64 位整数(LLP64 系统),但这取决于编译器/系统,而不是 CPU。参见例如同一平台上的 Linux 与 MS Windows。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多