Futurebasic/语言/参考/enterproc
✔ 外观 ✔ 标准 ✔ 控制台
语法 1
"语句标签" ENTERPROC [(intVar1 [,intVar2 ...])] [语句块] EXITPROC [= intVar3]
语法 2
"语句标签" ENTERPROC FN fnName[(intVar1 [,intVar2 ...])] [= 类型] [语句块] EXITPROC [= 返回值]
ENTERPROC
语句标记了一个过程块的开始,该过程块必须以 EXITPROC
语句结束。过程块用于实现使用 Pascal 调用约定的函数,这是一种函数操作堆栈的特定方式。这种函数最常见的用途是实现 Toolbox "回调" 程序(在 Inside Macintosh 中通常称为 "应用程序定义例程")。这种回调程序必须使用 Pascal 调用约定。
ENTERPROC
过程块只能出现在程序的 "主" 范围内;不能出现在 LOCAL FN
内。每个 intVar
必须是短整型(2 字节)变量或长整型(4 字节)变量,或 POINTER
或 HANDLE
变量。语句块
可以包含任何 FB 语句集合,除了另一个 ENTERPROC
...EXITPROC
块(即,过程块不能嵌套)。所有在过程块中引用的变量的作用域要么是全局的(如果变量是在 BEGIN GLOBALS
...END GLOBALS
块中早先声明的),要么是过程块本身的局部范围。
当某些调用者(通常是 Toolbox 例程)引用过程块在内存中的地址时,就会调用过程块;你的程序可以使用 PROC"语句标签"
函数来获取该地址。通常,你的程序会将该地址传递给 Toolbox 例程,以识别过程块作为 "回调" 程序。当过程块被调用时,intVar1
、intVar2
等被分配了调用者传递的值。当达到 EXITPROC
语句时,控制权会返回给调用者,如果指定了 intVar3
(或 returnValue
),则其值将返回给调用者。
重要的是,你应该知道调用者希望传递给你的过程块的参数数量和类型(如果有),以及你应该相应地设置 ENTERPROC
语句中的 intVar1
、intVar2
(等)参数。同样地,你应该知道调用者是否希望你的过程块返回一个值,以及如果是这样的话,调用者是否希望返回一个 2 字节或 4 字节的值。如果你使用语法 1,如果调用者希望返回一个值,你应该在 intVar3
中指定一个适当大小的变量;否则,你应该省略 intVar3
。如果你使用语法 2,如果调用者希望返回一个值,你应该在 类型
参数中指定一个 2 字节或 4 字节类型的名称(如 INT
或 POINTER
),并在 返回值
表达式中指定该类型的名称;否则,你应该省略 类型
和 返回值
。如果你没有在你的 ENTERPROC
和 EXITPROC
语句中正确设置输入参数和返回值参数,那么你的程序在调用过程块时很可能会崩溃。参见 <a href="app.%20c%20data%20types.html">附录 C</a>: 数据类型和数据表示,获取有效 2 字节和 4 字节变量类型的列表。
如果你使用语法 2,你也可以使用 FN <用户函数>
语句来执行过程块,尽管这样做通常没有太大必要(当你想要创建一个将被你的程序显式调用的过程时,使用 LOCAL FN
通常更好)。
注意
当你的程序启动时,它不会自动 "跳过" 过程块中的行,就像它跳过 LOCAL FN
中的行一样。为了防止你的过程块被意外执行,你应该使用 GOTO
分支到过程块,例如
GOTO "Detour" "myProc1" ENTERPROC(var&) : EXITPROC "myProc2" ENTERPROC(var1%, var2&) : EXITPROC = result& "Detour"
或者你应该将过程块放置在 END
语句之后,例如
'[程序主部分在这里] END '======= 过程 ======= "myProc1" ENTERPROC(var&) : EXITPROC "myProc2" ENTERPROC(var1%, var2&) : EXITPROC = result&
CALL <地址>; 附录 C: 数据类型和数据表示