CONSTRUCTOR(模块)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgModuleConstructor
- 最后更新: 2023-10-13
指定在模块级代码之前执行一个过程
语法
[Public | Private] Sub procedure_name [Alias "external_identifier"] [()] Constructor [priority]
{ procedure body }
End Sub说明
Constructor 关键字用于 Sub 定义(禁止在声明行级别使用),以强制在模块级代码执行之前执行该过程。定义为构造函数的过程可以像普通过程一样使用,即可以从模块级代码以及其他过程中调用。
该过程必须有一个空的参数列表。如果 Constructor 关键字用于有一个或多个参数的 Sub 定义中,将产生编译时错误。在一组重载过程中,只能定义一个 (1) 构造函数,因为具有多个不带参数的 Sub 会产生歧义。
在单个模块中,根据目标系统的编译和运行时环境:
- 构造函数可能按定义顺序或逆序执行
- 构造函数可能在有构造函数的全局静态变量之前或之后执行
- 构造函数可能在有
priority属性的其他模块构造函数之前或之后执行 - 有
priority属性的构造函数可能在有构造函数的全局静态变量之前或之后执行
priority 属性是一个 101 到 65535 之间的整数,可用于强制构造函数按特定顺序执行,相对于其他也有 priority 属性的构造函数。priority 的值没有特定含义,只有与其他构造函数优先级的数值关系才有意义。101 是最高优先级,相对于其他有 priority 属性的构造函数,它最先执行。
一个模块可以定义多个构造函数过程,多个模块也可以定义额外的构造函数,前提是没有两个 Public 构造函数共享相同的 procedure_name。
当链接到也定义了构造函数的模块时,除非使用了 priority 属性,否则在链接时无法保证执行顺序。因此,在使用可能调用另一个也定义了构造函数的辅助模块的构造函数时,应特别小心。在这种情况下,建议使用单个构造函数,在其中显式调用这些模块的初始化过程。
用户定义 type 的公有静态成员过程(一个具有空参数列表的 Sub),可以通过在 sub 过程定义中添加 Constructor 关键字,被定义为模块构造函数。
值可以在编译时确定的静态简单数字类型变量的初始化(例如,默认为零、常量、指向静态对象的指针、指向函数的指针等),在任何代码执行之前就完成了初始化。这些值是可执行映像的一部分,在可执行文件加载到内存时就有了初始值。不需要代码初始化的普通静态全局变量,保证已被初始化,可以在所有代码中可靠使用,包括全局静态对象构造函数和模块构造函数。
模块构造函数功能暴露了编译和运行时环境中的一个低级链接时特性。应避免从模块构造函数中访问有构造函数的全局静态对象,因为在不同构建系统上执行顺序可能有所不同。
仅针对 64 位编译器的警告:请参阅标识符规则页面,了解用户过程标识符名称的选择(特别是"平台差异"段落)。
示例
start GeSHi
'' ConDesExample.bas : An example program that defines two sets of
'' constructors and destructors. Demonstrates when and in what order
'' they are called when linking a single module.
Sub Constructor1() Constructor
Print "Constructor1() called"
End Sub
Sub Destructor1() Destructor
Print "Destructor1() called"
End Sub
Sub Constructor2() Constructor
Print "Constructor2() called"
End Sub
Sub Destructor2() Destructor
Print "Destructor2() called"
End Sub
'' ----------------------
Print "module-level code"
End 0
'' ----------------------end GeSHi
输出:
Constructor2() called
Constructor1() called
module-level code
Destructor1() called
Destructor2() called与 QB 的区别
- FreeBASIC 新增
参见
返回过程