Skip to content

DESTRUCTOR(模块)


指定在程序终止时执行一个过程

语法

vb
[Public | Private] Sub identifier [Alias "external_identifier"] [()] Destructor [priority] [Static]

{ procedure body }

End Sub

说明

定义一个在编译程序的结束代码中自动调用的过程。结束代码由编译器生成,在程序正常终止时执行。定义为析构函数的过程可以像普通过程一样使用,即可以从模块级代码以及其他过程中调用。

该过程必须有一个空的参数列表。如果 Destructor 关键字用于有一个或多个参数的 Sub 定义中,将产生编译时错误。在一组重载过程中,只能定义一个 (1) 析构函数,因为具有多个不带参数的 Sub 会产生歧义。

在单个模块中,根据目标系统的编译和运行时环境:

  • 析构函数可能按定义顺序或逆序执行
  • 析构函数可能在有析构函数的全局静态变量之前或之后执行
  • 析构函数可能在有 priority 属性的其他模块析构函数之前或之后执行
  • priority 属性的析构函数可能在有析构函数的全局静态变量之前或之后执行

priority 属性是一个 101 到 65535 之间的整数,可用于强制析构函数按特定顺序执行。priority 的值没有特定含义,只有与其他析构函数优先级的数值关系才有意义。101 是最低优先级,相对于其他有 priority 属性的析构函数,它最后执行。

一个模块可以定义多个析构函数过程。析构函数过程也可以出现在多个模块中。所有以上述语法定义的过程都将被添加到程序终止期间要调用的过程列表中。

多个模块中定义的析构函数的执行顺序只在链接时才能确定。因此,在使用可能调用另一个也定义了析构函数的辅助模块的析构函数时,应特别小心。在这种情况下,建议使用单个析构函数,在其中显式调用多个模块的终止过程,以确保应用程序优雅终止。

如果程序正常终止,或者启用了错误检查且程序异常终止,析构函数将被调用。

用户定义 type 的公有静态成员过程(一个具有空参数列表的 Sub),可以通过在 sub 过程定义中添加 Constructor 关键字,被定义为模块析构函数。

模块析构函数功能暴露了编译和运行时环境中的一个低级链接时特性。应避免从模块析构函数中访问有析构函数的全局静态对象,因为在不同构建系统上执行顺序可能有所不同。

仅针对 64 位编译器的警告:请参阅标识符规则页面,了解用户过程标识符名称的选择(特别是"平台差异"段落)。

示例

start GeSHi

vb
Sub pauseonexit Destructor
   
    '' If the program reaches the end, or aborts with an error,
    '' it will run this destructor before closing
   
    Print "Press any key to end the program..."
    Sleep
   
End Sub

Dim array(0 To 10, 0 To 10) As Integer
Dim As Integer i = 0, j = 11

'' this next line will cause the program to abort with an
'' error if you compile with array bounds checking enabled (fbc -exx ...)
Print array(i, j)

end GeSHi

与 QB 的区别

  • FreeBASIC 新增

参见

  • Destructor (Class)
  • Constructor (Module)
  • Sub

返回过程

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系