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

在VBA中,什么真正决定了指针的大小?,vba,pointers,32bit-64bit,portability,Vba,Pointers,32bit 64bit,Portability,传统智慧: 在最新版本的VBA(VBA7)中,使用LongPtr键入 表示指针,可在32位和64位系统上使用。旧时 VBA版本,使用Long表示指针(假设为32位 主机,但由于所有64位主机都使用最新的 VBA的版本) 什么是LongPtr?那么根据, LongPtr(Long32位系统上的整数,LongLong64位系统上的整数 系统) 这两条信息证实了一个事实:在32位系统上,指针需要4个字节,并且应该存储在Long中;在64位系统上,指针需要8个字节,并且应该存储在Long 进一步说,Lo

传统智慧:

在最新版本的VBA(VBA7)中,使用
LongPtr
键入 表示指针,可在32位和64位系统上使用。旧时 VBA版本,使用
Long
表示指针(假设为32位 主机,但由于所有64位主机都使用最新的 VBA的版本)

什么是LongPtr?那么根据,

LongPtr
Long
32位系统上的整数,
LongLong
64位系统上的整数 系统)

这两条信息证实了一个事实:在32位系统上,指针需要4个字节,并且应该存储在
Long
中;在64位系统上,指针需要8个字节,并且应该存储在
Long

进一步说,
LongPtr
在引擎盖下看起来有点像这样:

#If Win64 Then
    typedef LongPtr As LongLong
#Else
    typedef LongPtr As Long
#End If
i、 e.指针大小与主机比特数直接相关。根据我的经验,这种解释一直很有效


问题 正如中所指出的,指针的大小往往与体系结构的位大小相同。例如,对于32位程序,指针为4字节,对于64位程序,指针为8字节。然而,没有理由认为情况必然如此;具有64位内存大小的程序仍然可以使用32位指针来导航

你想想看就明白了。仅仅因为我的64位程序使用了8字节块来分割内存,并不意味着我需要2^64个不同的指针来导航它。我可能总共只有16个字节的内存,在这种情况下,我的指针可以是
1
0


所以我的问题是:

  • 长PTR是否根据主机比特数定义
  • 如果是这样的话,有没有这样做是安全的原因?VBA是否意味着指针总是与宿主程序的位大小相匹配
  • 如果没有,它们是如何定义的?
    • 这与用于宿主程序的编译器有关吗
    • Excel、Word或SolidWorks主机之间的指针长度会有所不同吗

  • 第2.3节之前的两段


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

    我想我明白了,但我只是想确认一下——这里的“实现”是什么意思?我假设它是VBA语言的实现,在这种情况下,我认为只有一个实现(微软自己的,我想每一位都有一个)因此,这个建议基本上保证了32位系统上的
    Long
    和64位系统上的
    LongLong
    ,因为Excel就是这样做的,而且作为扩展,每个人都必须这样做。这是正确的吗?还是我误解了,这是在谈论主机应用程序的实现,其中有数百个,所以指针大小可能会改变一个应用到另一个应用?