在VBA中,什么真正决定了指针的大小?
传统智慧: 在最新版本的VBA(VBA7)中,使用在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
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就是这样做的,而且作为扩展,每个人都必须这样做。这是正确的吗?还是我误解了,这是在谈论主机应用程序的实现,其中有数百个,所以指针大小可能会改变一个应用到另一个应用?