是什么真正决定了VBA中的指针大小?

问题描述 投票:3回答:1

常规智慧:

在最新版本的VBA(VBA7)中,使用LongPtr类型表示在32位和64位系统上均有效的指针。在旧版本的VBA,请使用Long表示指针(假设是32位主机,但this is a safe assumption,因为所有64位主机都使用最新的版本的VBA)。

LongPtr到底是什么?好吧,根据VBA language reference

LongPtr(在32位系统上为Long整数,在64位系统上为LongLong整数系统)

这两条信息证实了一个事实:在32位系统上,指针占用4个字节,应该存储在Long中;在64位系统上,指针占用8个字节,应该存储在[[ C0]

通过扩展,LongLong看起来有点像这样:

LongPtr

即指针大小直接链接到主机位数。以我的经验,这种解释一直很好。


问题

#If Win64 Then typedef LongPtr As LongLong #Else typedef LongPtr As Long #End If 中所指出的,指针tend的大小与体系结构的位数相同。例如。对于32位程序,指针是4个字节,对于64位程序,指针是8个字节。 但是没有必要一定要这样做的理由;具有64位内存大小的程序仍可以使用32位指针对其进行导航。

这很有意义,您可以考虑一下。仅仅因为我的64位程序使用了8个字节的块来拆分其内存,并不意味着我需要2 ^ 64个不同的可能的指针来导航它。我总共可能只有16个字节的内存,在这种情况下,我的指针可能只是this question1


所以我的问题:

  • 是否根据主机位数定义了LongPtr?
  • 如果是这样,是否有理由这样做是安全的-有关VBA的某些事情意味着指针将始终与主机程序的位大小匹配?
  • 如果没有,如何定义它们?
    • 与用于宿主程序的编译器有关吗?
    • Excel,Word或SolidWorks主机之间的指针长度会有所不同吗?
vba pointers 32bit-64bit portability
1个回答
1
投票

第2.3节之前的两个段落

0

“还定义了一个实现定义的LongPtr类型别名,映射到该实现将用于保存指针或处理值的基础声明类型。32位实现应将LongPtr映射到Long,而64位实现应将LongPtr映射到LongLong,尽管实现可以将LongPtr映射到实现定义的指针类型。LongPtr类型别名在其基础声明的类型有效的任何地方都有效。

© www.soinside.com 2019 - 2024. All rights reserved.