跳转到内容

Futurebasic/语言/参考/enterproc

来自维基教科书,自由的教科书

ENTERPROC 语句

[编辑 | 编辑源代码]

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 字节)变量,或 POINTERHANDLE 变量。语句块 可以包含任何 FB 语句集合,除了另一个 ENTERPROC...EXITPROC 块(即,过程块不能嵌套)。所有在过程块中引用的变量的作用域要么是全局的(如果变量是在 BEGIN GLOBALS...END GLOBALS 块中早先声明的),要么是过程块本身的局部范围。

当某些调用者(通常是 Toolbox 例程)引用过程块在内存中的地址时,就会调用过程块;你的程序可以使用 PROC"语句标签" 函数来获取该地址。通常,你的程序会将该地址传递给 Toolbox 例程,以识别过程块作为 "回调" 程序。当过程块被调用时,intVar1intVar2 等被分配了调用者传递的值。当达到 EXITPROC 语句时,控制权会返回给调用者,如果指定了 intVar3(或 returnValue),则其值将返回给调用者。

重要的是,你应该知道调用者希望传递给你的过程块的参数数量和类型(如果有),以及你应该相应地设置 ENTERPROC 语句中的 intVar1intVar2 (等)参数。同样地,你应该知道调用者是否希望你的过程块返回一个值,以及如果是这样的话,调用者是否希望返回一个 2 字节或 4 字节的值。如果你使用语法 1,如果调用者希望返回一个值,你应该在 intVar3 中指定一个适当大小的变量;否则,你应该省略 intVar3。如果你使用语法 2,如果调用者希望返回一个值,你应该在 类型 参数中指定一个 2 字节或 4 字节类型的名称(如 INTPOINTER),并在 返回值 表达式中指定该类型的名称;否则,你应该省略 类型返回值。如果你没有在你的 ENTERPROCEXITPROC 语句中正确设置输入参数和返回值参数,那么你的程序在调用过程块时很可能会崩溃。参见 <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: 数据类型和数据表示

华夏公益教科书