gpt4 book ai didi

vba - VBA.CBlah 和 CBlah 的区别

转载 作者:行者123 更新时间:2023-12-04 15:17:14 25 4
gpt4 key购买 nike

奇怪的观察:

通常,当我想将地址保存到变量中的函数时,我会执行以下操作:

Function getAddress(ByVal func As LongPtr) As LongPtr
getAddress = func
End Function

Sub printAddress()
Dim functionPointer As LongPtr
functionPointer = getAddress(AddressOf myFunc)
Debug.Print functionPointer
End Sub

但是我刚刚发现我可以使用 1-liner
functionPointer = VBA.CLngPtr(AddressOf myFunc)

尽管
functionPointer = CLngPtr(AddressOf myFunc)

...不起作用并引发

Compile error:

Expected: expression



这是怎么回事?据我所知,唯一的区别是 CLngPtr在全局变量(类?)中声明,而 VBA.CLngPtr是明确限定的,但我不知道为什么这会导致观察到的行为(它们都指向同一个函数,不是吗?)

最佳答案

如果您使用默认的 IDE 设置,而关键字和标识符的设置并没有那么不同,这将不是很明显。以下是使用不同颜色时的外观:
Sample Code

你可以看到CLngPtr像圣诞树一样亮起,看起来就像任何其他关键字一样。将此与 Abs 进行比较,这也是一个函数,但保持浅蓝色,就好像它只是一个标识符。

这是一个提示 CLngPtr由 VBA 编译器优化,因此它实际上是内联方法 1,这就是如果您尝试使用 CLngPtr 会出现错误的原因作为表达。然而,一个 VBA.CLngPtr是一个适当的函数,因此可以用作表达式的一部分,但由于非优化路线而具有非常轻微的性能损失。

你会看到同样的事情说,CLng或任何转换函数,甚至 Mid声明(不是函数)。 VBA 中有几个函数这可能会被编译器内联,并且通常会因它们是否变成关键字而有所不同。另请注意,括号的颜色不同。

见鬼,甚至 Debug.Print也得到了特殊待遇,如果你熟悉它,你可能知道它不完全是一个类,也不是一个模块,但你不能Print没有 Debug .

  • 当我们在这里提到“内联”时,我们谈论的是 VBA 编译器在较低级别执行的操作,低于我们在源代码级别看到的。来自源代码,C***()VBA.C***()基本上是一样的。但是,VBA 编译器可以并且将尝试通过内部重新排列机器指令以进行转换(或内联函数正在执行的任何操作)来优化这些位。重新排列指令的效果是它可能不再在所有上下文中兼容。在这种情况下,我可以想象(但不知道事实!)CLngPtr()的内联指令返回一个值,而不是一个引用,这与参数声明不兼容,这就是我们尝试将其用作参数时出现语法错误的原因。注意 AddressOf 不会发生这种情况-- LHS 上的任何其他函数都会有相同的语法错误,因此它与 AddressOf 无关以及内联方法的所有内容。
  • 关于vba - VBA.CBlah 和 CBlah 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57395851/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com